-
原型的5个规则
- 所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”意外)
- 所有的引用类型(数组,对象,函数),都有一个__proto__(隐式原型)属性,属性值是一个普通对象
- 所有的函数都有一个prototype(显式原型)属性,属性值是一个普通对象
- 所有的引用类型(数组,对象,函数),__proto__属性指向它的构造函数“prototype”属性值
-
function Foo(name, age) { this.age = age this.name = name this.class = 'class-1' } var f = Foo('zhangsan', 23) console.log(f.__proto__ === Foo.prototype) // true
- 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回它的__proto__(即它的构造函数的prptotype)中寻找
-
function Adf(name, age) { this.name = name } Adf.prototype.alertName = function () { alert(this.name) } var a = new Adf('zhang') a.printName = function () { console.log(this.name) } a.printName() a.alertName()
循环自身的属性
还是对上面的测试代码来说,如果对进行循环的话,可以找到,name属性,alertName属性,printName属性,但是一般情况下,我们只希望得到这个对象自身定义的属性,比如:name属性与printName属性
var item for(item in f){ if(f.hasOwnProperty(item)){ console.log(item); // 高级浏览器已经在forin中屏蔽了来自原型的属性 //但在这里建议大家还是加上这个判断,保证程序的健壮性(程序对于规范要求以外的输入情况的处理能力) } }
this
对上面测试代码来说,永远指向对象本身,所以执行a.alertName
可以弹出zhang