当前位置:  开发笔记 > 编程语言 > 正文

JavaScript中的原型继承惯例

如何解决《JavaScript中的原型继承惯例》经验,为你挑选了1个好方法。

我看到很多像这样的代码:

function Base() {}
function Sub() {}
Sub.prototype = new Base();

但是,如果你这样做:

s = new Sub();
print(s.constructor == Sub);

这是错误的.这对我来说似乎很困惑,因为s的构造函数确实是Sub.这样做是常规/更好吗?

function Base() {}
function Sub() {}
Sub.prototype = new Base();
Sub.prototype.constructor = Sub;

或者它真的不重要吗?



1> bobince..:

'constructor'不会像它看起来那样做.除了非标准之外,这是避免使用它的一个很好的理由 - 坚持使用instanceof和prototype.

从技术上讲:'constructor'不是's'实例的属性,它是'Sub'原型对象的一个​​属性.当您在Mozilla中创建"Sub"函数时,您将获得一个新创建的默认Sub.prototype对象,该对象具有指向Sub函数的"构造函数"作为礼貌.

但是,然后用新的Base()替换该原型.返回Sub的原始默认原型丢失了; 相反,Sub.prototype是Base的一个实例,没有任何重写的'constructor'属性.所以:

new Sub().constructor===
Sub.prototype.constructor===
new Base().constructor===
Base.prototype.constructor===
Base

......一直到最基本的物体,你的原型没有改变.

这样做是常规/更好吗?

处理JavaScript对象/类时,没有一个约定; 每个库的元类系统的行为略有不同.我还没有看到一个手动为每个派生类写"构造函数"的人,但是如果你真的想让真正的构造函数可用,它似乎是一个很好的解决方案.它还将使代码与不提供"构造函数"的浏览器/引擎兼容.

不过,我会考虑给它一个不同的名称,以避免与现有的和不同行为的"构造函数"属性混淆.

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有