发表于: 2017-03-28 22:59:20
2 1153
今天完成的事情: 学习原型、原型链
明天计划的事情:学习js有限状态机,准备小课堂,写任务4
遇到的问题:基础不好,学习基础知识用了很久。原型知道是什么意思了,基本的语法也会用了,
但是还是讲不清楚。
收获:
无论何时,创建一个新函数数后,会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。默认情况下,原型对象会自动获得一个constructor(构造函数)属性,这个属性是指向prototype属性所在函数的指针。
例如下面的例子:
function Person() {
}
Person.prototype.name = "shit";
Person.prototype.age =99;
Person.prototype.sayName = function () {
alert(this.name);
}
var person1 = new Person();
Person.prototype指向Person构造函数的原型对象,Person.prototype.constructor指向Person
对于实例person1, person1.prototype也是指向Person构造函数的原型对象,而不是构造函数。
换句话说,person1和构造函数没有直接关系。红宝书148面的图很清楚。
更简单的原型语法:
用对象字面量来重写整个原型对象
function Person() {}
Person.prototype = {
name : "shit",
age : 99,
sayName : function () {
alert(this.name);
}
}
原型链,这个和作用域链很类似。可以这样理解:为了确定一个属性的值,查找的顺序。
直接看例子吧:
function SuperType() {
this.property = true;
}
SuperType.prototype.getSuperValue = function () {
return this.property;
}
function SubType() {
this.subproperty = false;
}
SubType.prototype = new SuperType();
var instance = new SubType();
console.log(instance.getSuperValue());
最后console.log出来是true,其实不难理解,顺着原型链网前找就是了。
首先类型SubType是类型SuperType的继承,instance 是类型SuperType的实例。
instance实例没有getSuperValue()方法,所以找上一级的SubType.prototype ,这个原型对象也没有,就找上一级的SuperType.prototype,找到了,所以instance的getSuperValue()方法就继承于SuperType.prototype。
红宝书163面的图 画的很好
评论