美文网首页
重写原型对象的一些问题

重写原型对象的一些问题

作者: sprittee | 来源:发表于2018-08-16 00:13 被阅读0次

首先我们创建对象Scholar,并且示例化对象,然后重写原型

function Scholar() {
}
var scholar=new Scholar();
Scholar.prototype = {
    name: "Aron",
    age: "22",
    job: "hacker",
    sayName: function() {
        alert(this.name);
    }
};
scholar.sayName();//TypeError:scholar.sayName is not a function

运行时我们会发现错误

TypeError:scholar.sayName is not a function

为什么会这样呢?

这就牵涉到了原型对象和实例对象的关系,在上述对象中,如果我要在scholar对象上调用sayName()方法,就会先判断scholar对象的属性中有没有sayName这个属性,如果有,就直接调用,没有的话就在scholar的原型对象prototype中寻找,这个原型对象,它是一个类固有的属性,跟constructor类似这里需要注意的是,用构造函数创建的实例,会自动包含一个叫做[[prototype]],[[prototype]]是一个指针,[[prototype]] 指向一个Object Prototype,Object Prototype是一个特殊的实例,在上文中,我们可以通过以下代码直接访问原型属性。

alert(Scholar.prototype.name);//Aron

而当scholar没有sayName属性时,会通过[[prototype]]指针找到Scholar Prototype表,在这种添加原型属性的情况下,sayName是可以被找到的。

Scholar.prototype.name="Aron";
Scholar.prototype.sayName=function(){
    alert(this.name);
};
Scholar.prototype.sayName();//Aron
scholar.sayName();//Aron

但是如果通过重写整个prototype来”修改Prototype",是不可以通过scholar上的[[prototype]]找到sayName的,因为重写整个prototype会重新创建一个新的Scholar Prototype原型对象,已创建scholar上的[[prototype]]指针还是指向了旧的Scholar Prototype原型对象,自然是找不到sayName属性了。

因此,要想重写prototype,还能让对象的[[prototype]]指针指向新的Scholar Prototype原型对象,最简单的办法就是重写完原型对象再进行实例化操作了。

function Scholar() {
}
Scholar.prototype = {
    name: "Aron",
    age: "22",
    job: "hacker",
    sayName: function() {
        alert(this.name);
    }
};
var scholar=new Scholar();//实例化scholar在重写原型之后
scholar.sayName();//Aron

相关文章

  • 重写原型对象的一些问题

    首先我们创建对象Scholar,并且示例化对象,然后重写原型 运行时我们会发现错误 TypeError:schol...

  • javascirpt复习

    实例中访问构造函数原型的指针,指向的是构造函数原型,不是构造函数; 所以重写构造函数原型对象,【实例对象】访问还是...

  • JS中的继承方式:

    1.1 原型链继承 原型继承: 将子类B的原型对象 重写成父类A的一个实例。 B.prototype = new ...

  • 原型模式

    定义:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象。 实现一个接口,然后重写clone方法。

  • JavaScript面向对象-原型的重写

    在上一篇文章中我们介绍了原型的内存模型,通过4张图分析了原型在各个阶段的状态。下面我们将首先要介绍一些常用的原型和...

  • 原型,构造函数,实例之间的关系

    重写对象切断了现有原型和之前存在的实例之间的联系,原来的实例引用的仍然是最初的原型对象 总结: 1.默认状态 构造...

  • js里对象构造函数Object的getter和setter方法

    每个对象实例的proto 等于这个对象的构造函数的原型。即: 可以通过重写Object的getter和setter...

  • 聊一聊JS的继承

    常见的继承方式有哪些 循序渐进着来看,分为以下几种 类(原型链)继承 —— 用父类的实例重写子类原型对象 构造函数...

  • 继承复习

    1、原型链---继承通过创建父类的实例。本质上市重写原型对象 使用字面量添加的新方法,会使,继承一行的代码无效。c...

  • javascript中面向对象编程-创建对象之原型模式

    理解名词:对象 原型对象 原型属性 函数 构造函数 实例 对象: Object,创建对象,对象属性方法原型对象:...

网友评论

      本文标题:重写原型对象的一些问题

      本文链接:https://www.haomeiwen.com/subject/xoggbftx.html