博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对js原型对象的拓展和原型对象的重指向的区别的研究
阅读量:6828 次
发布时间:2019-06-26

本文共 1358 字,大约阅读时间需要 4 分钟。

我写了如下两段代码:

function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; p1.sayName();

这一段的运行结果是:Uncaught TypeError: undefined is not a function

然后我又把它改写为下面的代码:

function Person(){} Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; var p1 = new Person(); p1.sayName();

运行结果却是没问题的,为什么会这样呢。

原型不是具有动态性吗,在它上面所做的任何修改不是都会反映到实例上吗。所以我就有些想不明白了,烦劳哪位大神能给解释一下。在此先行谢过了。

 
 

4 个回答

 

3

 
采纳

让我来给你解释一下吧。

看看下面这段代码

function Person(){} var proto1 = Person.prototype; var p1 = new Person(); Person.prototype = { constructor: Person, name: "cxc", age: 20, sayName: function(){ console.log(this.name); } }; console.log(Person.prototype.isPrototypeOf(p1)); //输出false console.log(proto1.isPrototypeOf(p1)); //输出true

The isPrototypeOf() method tests for an object in another object's prototype chain.

意思就是:Object.isPrototypeOf(obj)可以用来检测该原型是否处于obj对象的原型链上。

在上面这段代码中,首先我将一开始Person.prototype的引用指向proto1

最后我重新检验发现,Person.prototype已经不是p1的原型了,而proto1还是p1的原型。

其实罪魁祸首就是Person.prototype = {...}这句话,因为它声明了一个新的对象,让Person.prototype指向它。

要实现题主所需要的动态增加属性的功能可以这么写:

function Person(){} var p1 = new Person(); Person.prototype.name = 'hi'; Person.prototype.sayName = function(){ console.log(this.name); } p1.sayName();

这样做就不是重新声明一个原型对象,而是对原来的原型对象进行扩展

转载地址:http://sdykl.baihongyu.com/

你可能感兴趣的文章
c# enum用法
查看>>
Struts2 中action之间的跳转(分享)
查看>>
HDU4707:Pet(DFS)
查看>>
html标签页图标
查看>>
C# list 新用法
查看>>
Android 获取控件相对于屏幕位置
查看>>
DNGuard Enterprise v2.80 released
查看>>
WPP
查看>>
C# GetSchema Get List of Table 获取数据库中所有的表名以及表中的纪录条数的方法
查看>>
PySide教程:“.NET研究”第一个PySide应用
查看>>
winrar自解压释放路径详解
查看>>
图像开运算+闭运算+腐蚀+膨胀
查看>>
poj-1324 Holedox Moving **** [转]
查看>>
深入foreach工作方式
查看>>
UIView 进行各种动画展示及其用法解释
查看>>
公布2012年5月赛CSDN算法达人赛试题及参考答案
查看>>
Mysql ON子句和USING子句
查看>>
linux杂谈
查看>>
类型、值和变量
查看>>
UIImage+Scale
查看>>