предисловие
Все большие ребята здесь, найдите минутку, чтобы прочитать это, и будьте осторожны после прочтения, иначе у вас не будет мотивации продолжать писать, ха-ха
Начинать
Предварительные знания
Знание цепочки прототипов--- Не говорите больше о картинке, картинка стоит тысячи слов
function Test () {
this.name = 'test';
}
var fn = new Test;
console.log(fn.name);
//我们称Test为构造函数 fn为构造函数Test的实例
//Test的prototype(原型)和实例的__proto__(原型)都指向了原型同一个原型对象
//原型对象的constructor指向了构造函数
Object.createВот еще одна картинка, чтобы ясно объяснить, что он делает
Первый класс простейшего наследования --- прототипное наследование
// 原型继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
}
B.prototype = new A;
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
fn.getX();//=>test
Суммировать
Вот и всеэкземпляр B fnУнаследовал все свойства и методы родительского класса (A). Мы называем собственные свойства и методы A (x) какчастная собственность, вызываются методы и свойства (getX) прототипа родительского класса (A).общественная собственность.Этот метод наследования заключается в том, чтобы наследовать общедоступные свойства и частные свойства родительского класса (A) в общедоступные свойства подкласса (B)..
преимущество: Простой и практичный
недостаток: потому что только изменение точки прототипа приводит к тому, что конструктор указывает на A, и все они становятся их собственными общедоступными свойствами.
способы улучшения
// 原型继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
}
B.prototype = new A;
B.prototype.constructor = B;//手动改变constructor
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
fn.getX();//=>test
Второй призыв Чтобы изменить использование этой точки, чтобы позвонить наследуемое ----
// call继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
A.call(this);
}
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
Суммировать
Вот и всеэкземпляр B fnУнаследовал частные свойства и методы в A.Этот метод наследования заключается в том, чтобы наследовать частное свойство A в частное свойство B..
преимущество:Простой
недостаток: может наследовать только частные свойства родительского класса
Третье свойство копирования для достижения наследования --- претендует на наследование объектов
//冒充对象继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
var temp = new A;
for (key in temp) {
// this=>实例fn
this[key] = temp[key];
}
temp = null;
}
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
Суммировать
Вот и всеэкземпляр B fnУнаследовал частные свойства и методы в A.Этот метод наследования заключается в том, чтобы наследовать частное свойство A в частное свойство B..
недостаток: может наследовать только частные свойства родительского класса
Четвертое смешанное наследование
//混合模式继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
A.call(this);
}
B.prototype = new A;
B.prototype.constructor = B;//手动改变constructor
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
fn.getX();//=>test
Суммировать
Вот и всеэкземпляр B fnВсе свойства и методы в A наследуются.Этот метод наследования заключается в том, чтобы наследовать общедоступные свойства и частные свойства родительского класса (A) в общедоступные свойства подкласса (B) и наследовать частные свойства родительского класса в частные свойства подкласса..
преимущество: очень всеобъемлющий
недостаток: Поскольку изменяется только указатель прототипа, конструктор все указывает на родительский класс (A), а частные свойства родительского класса копируются дважды.
Пятый шаблон создания наследования
//Create模式继承
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
A.call(this);
}
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;//手动改变constructor
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
fn.getX();//=>test
Суммировать
Вот и всеэкземпляр B fnВсе свойства и методы в A наследуются. ** Этот метод наследования заключается в том, чтобы наследовать общедоступные и частные свойства родительского класса (A) общедоступным свойствам и частным свойствам подкласса (B) соответственно.
преимущество: очень всеобъемлющий
недостаток:Метод Object.create не поддерживает IE6 7 8
Улучшено до совместимой версии
//Create模式继承 兼容
function A() {
this.x = 'test';
}
A.prototype.getX = function () {
console.log(this.x);
};
function B() {
this.y = 'test2';
A.call(this);
}
B.prototype = myCreate(A.prototype);
B.prototype.constructor = B;//手动改变constructor
var fn = new B;
console.log(fn.x);//=>test
console.log(fn.y);//=>test2
fn.getX();//=>test
function myCreate (o) {
function fn () {}
fn.prototype = o ;
return new fn;
}
Суммировать
Каждый метод имеет свои преимущества и недостатки, для простоты рекомендуется использовать первый, но предпочтительнее последний.
Статью написать не просто, надеюсь, вы, братья, сестры и старшие братья, будете осторожны.