js prototype tips
2018-09-24 本文已影响26人
闲杂人等
- 用function定义的“类型”即方法有prototype属性,该属性指向此类的原型对象(是对象不是类型)。用function创建一个类型后,prototype指向的对象有两个属性,一个是constructor:指向自身的方法,一个是proto指向object.
chrome console输出 - 对象没有prototype属性,但有proto属性,指向其类型的prototype
chrome console - 使用prototype可以设定对象属性的默认值。
- delete操作将对象属性恢复为prototype中规定的默认值
function Obj() {
this.pro = 'native property';
this.proPrint = function () {
return this.pro;
};
}
Obj.prototype.proPrint = function () {
return 'prototype property';
};
var obj = new Obj();
console.log(obj.proPrint());
delete obj.proPrint;
console.log(obj.proPrint());
执行结果:
native property
prototype property
- 使用prototype创建大量副本,可以提高性能
let obj = new Type(1,2) {this.x = 1;this.y=2};
let objs = [ ];
let ObjPrototype = function(){};
ObjPrototype.prototype = obj;
for(let i = 0; i< 10000; i++) {
//由于ObjPrototype的构造函数为空,故比直接构造obj的副本快得多
objs[i] = new ObjPrototype();
}
- 定义方法
function Obj(x,y) {this.x =x; this.y = y;}
Obj.prototype.method1 = function(){
//todo something;
};
如此创建的方法可以成为静态方法或原型方法,称为“静态”是因为prototype 所有实例会共享唯一的一份数据。
- 实例只能用同名属性覆盖prototype的属性,而不能改变它。对象读取某个属性时,会先从自身的属性表开始查找,未找到就查找原型域(不是prototype属性,对象没有prototype属性,原型存储的区域)。找不到就递归查找。直至此对象的prototype域为本身或出现循环。
- 改变某类型原型域上的属性或属性值会影响每一个以此类型创建的对象(实例)。
- 每个对象,都有一个名为constructor的隐式属性,该属性引用的是创建该对象的构造器。由于prototype 是构造器的一个属性,所以每个对象都有一种方式可以找到自己的原型