发表于: 2017-03-28 22:59:20

2 1154


今天完成的事情: 学习原型、原型链

明天计划的事情:学习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面的图 画的很好


返回列表 返回列表
评论

    分享到