打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
修改构造函数原型——JavaScript中的对象(二)
Email:longsu2010 at yeah dot net
今天先不写原型继承,先看一个误区:“改变构造函数的原型(prototype)将魔法般的(magically)更新新对象和已经存在的对象……”

这是完全错误的,不要相信解释JavaScript(包括任何事情)时使用了魔法(magic)这个单词的作者。

function C() {} //constructorvar x = new C();C.prototype.prop = 2;var y = new C();alert(x.prop);alert(y.prop);

这段代码将alert "2" 和 "2",这似乎证实了上面引号中的定义,因为x对象在创建后增加了属性prop。魔法般的?其实不是,看下面的例子。

function C() {} //constructorvar x = new C();C.prototype = {prop: 2};var y = new C();alert(x.prop);alert(y.prop);

这段代码将alert "undefined" 和 "2"。
在第一个例子中对象x和y均有属性prop。他们是隐藏在对象所引用的原型中(隐藏? 因为只有解析器可以访问它)。当访问prop属性的时候JavaScript无法在对象本身中找到,之后会搜索原型链,在原型链中找到并返回。这对于一个程序员来说是透明的。当你向原型中增加一个新属性的时候对象x是不改变的。当你访问prop属性的时候会在更新后的原型中找到它。
第二个例子中我们将原型改为一个新对象,而x依然使用旧的原型,但是y使用的是新原型,所以x和y不共享原型。很明显旧原型不存在prop属性。更糟糕的是,现在你丢失了唯一的访问点(无法访问旧原型了)。虽然创建对象的语法相同,但是他们是不同的。
另外,众所周知,每一个对象有一个constructor属性指向构造函数。但是像prop那样,constructor属性存在于原型中而不是对象本身。
重写原型的同时也重写了constructor属性,如下:

alert(x.constructor); // "function C() {}"alert(y.constructor); // "function Object() { [native code] }"
因此当你重写原型后constructor属性是不可信的,但是重写原型又是JavaScript中的重要技术。

译者:
本文讲述了JavaScript中重写原型后原型不一致的问题和constructor属性指向问题。动态修改原型对象不会在已有对象中生效。重写原型对象后constructor的指向将是不可信的,可以在重写原型后将constructor属性重新赋值。如
function C();
C.prototype = {};

C.prototype.constructor = C;


相关文章:

你自认为理解了JavaScript?

JavaScript交流贴

JavaScript中的对象(一)

消除JavaScript中的if


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
JavaScript: 使用面向对象的技术创建高级 Web 应用程序
javascript?面向对象编程:封装
JavaScript语言精髓与编程实践20071115 笔记2 第三章JavaScript的非函数式语言特性
原型-尽人事以听天命
Javascript中的函数、this以及原型
JavaScript前端开发案例教程-第12章 面向对象编程
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服