- prototype,意为最初的,可用于规模应用的原型,默认值的意思。
prototype本身是一个Object。原始的Object.prototype包括constructor和_proto_
其中constructor指向自己本身,Object.prototype._proto_指向null(也是有Object.prototype._proto_指向null)。
所有的函数都有prototype,其最终指向Object.prototype。
2. 原型链,在new出来的对象中,对象具有_proto_,能够引用new 的函数的prototype(constructor和_proto_)
,无论通过多少层函数new出来的对象,最终指向Objects,最终相当于在Objects函数上new出来的对象
proto(new出来的对象)——prototype(子函数)——prototype(父函数)——Object.prototype——Object.prototype.proto=null。
function Grand(){
};
Grand();
var obj2 = new Grand();
注意:Grand()中的prototype指向Object的prototype。
3. 继承,new出来的对象可以直接使用函数prototype的属性和方法(继承);
function Grand(){
};
Grand();
var obj2 = new Grand();
var obj3 = new Grand();
var pt = Grand.prototype;
pt.abc = '123';
console.log(obj2.abc);//123
console.log(obj3.abc);//123
obj2.abc = '456';
console.log(obj2.abc);//456
注意obj2.abc = ‘456’;对自己_proto_.abc 进行赋值,优先级高于继承的属性。
那么如何改变已有的属性?
function Grand(){
};
Grand();
var obj2 = new Grand();
var obj3 = new Grand();
var pt = Grand.prototype;
pt.abc = '123';
console.log(obj2.abc);
console.log(obj3.abc);
obj2.abc = '456';
delete obj2.abc;//删除
Grand.prototype.abc = '789';//修改
console.log(obj2.abc);
console.log(obj3.abc);
由于obj2._proto_指向Grand.prototype,不建议在obj2._proto_上进行修改。
练习:一层继承
function Grand(){
}
function Father(){
}
var obj = new Grand();
Father.prototype = obj;//由此深刻认识对象的本质!
Father.prototype.constructor = Father;//另constructor回指原函数
var obj2 = new Father();
由此深刻认识对象的本质!
练习:多重继承
function Grand(){
}
function Father(){
}
var obj = new Grand();
Father.prototype = obj;
Father.prototype.constructor = Father;//另constructor回指原函数
var obj2 = new Father();
function Son(){
}
var obj3 = new Father();
Son.prototype = obj3;
Son.prototype.constructor = Son;
var obj4 = new Son();