javascript的原型与原型链

怎么说,在读第一遍《javascript高级程序设计》时,对象的创建、原型链、继承这个三个东东弄的我头皮发麻,我也找了些许博客资料:Javascript继承机制的设计思想 然后换个姿势再看一次书本,顿时理解了许多。
对于javascript的原型和原型链,继承和对象的原型模式创建都会用到。

一、对于原型模式创建对象中的prototype属性

在ECMAScript中函数即是对象,创建的每一个函数都有一个prototype属性,即原型属性。这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以有特定类型的所有实例共享的属性和方法。意思是:prototype就是通过调用构造函数而创建的那个对象实例的原型对象。可以让所有对象实例共享它所包含的属性和方法

function Pet(kind, color) {
    this.kind = kind;
    this.colors = ["black", "yellow"];
}
Pet.prototype = {
    constructor: Pet,
    say: function() {
        alert("I'm a " + this.kind);
    }
};
var cat = new Pet("cat");
var dog = new Pet("dog");
cat.colors.push("brown");
alert(cat.colors); //"black,yellow,brown"
alert(dog.colors); //"black,yellow"
alert(cat.colors == dog.colors); //false
alert(cat.say == dog.say); //true

以上是使用原型与构造组合方式构建对象,我将所有Pet(‘宠物’)共有的方法say放入原型,这样所有宠物都可以调用,而各自不同的属性就在构造函数定义。
例如:调用cat.say()时,解析器就会先问Pet()这个构造函数,是否有say属性,Pet()中没有,就会沿着原型链,问:cat的原型是否有say属性。有!于是就调用了共享的say()方法。

上面的代码有涉及到一个问题,那就是contructor的指向问题,当Pet.prototype使用字面量方式添加属性和方法时,相当于创建了一个新对象,这样就完全重写了默认的prototype对象,因此constructor属性也变成了新对象的constructor属性,指向Object,不再指向Pet,所以我们需要在代码中重新指回Pet对象

二、继承中的原型链

function SuperType() {
    this.property = true;
}
SuperType.prototype.getSuperValue = function() {
    return this.property;
};
function SubType() {
    this.subproperty = false;
}
//继承SuperType
SubType.prototype = new SuperType(); //重写了SuberType的原型
SubType.prototype.getSubValue = function() {
    return this.subproperty;
};
var instance = new SubType();
alert(instance.getSuperValue()); //true

instance.getSuperValue()会经过
1、搜索实例;
2、搜索Subtype.protoype;
3、搜索Supertype.prototype。

正因为原型链的存在才使得javascript才有了与有类概念的编程语言一样的继承上性质的相同,那就是实例化对象属于SubType,属于SuperType,也属于Object这个最大的对象。使其具有在继承上的完整性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值