- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
试图绕过 Javascript 对 OO 的看法......并且像许多其他人一样,对 constructor
属性感到困惑。特别是 constructor
属性的重要性,因为我似乎无法让它发挥任何作用。例如:
function Foo(age) {
this.age = age;
}
function Bar() {
Foo.call(this, 42);
this.name = "baz";
}
Bar.prototype = Object.create(Foo.prototype);
var b = new Bar;
alert(b.constructor); // "Foo". That's OK because we inherit `Foo`'s prototype.
alert(b.name); // "baz". Shows that Bar() was called as constructor.
alert(b.age); // "42", inherited from `Foo`.
在上面的例子中,对象 b
似乎有一个名为 (Bar
) 的正确构造函数——它继承了 Foo
。那么为什么很多人建议这是必要的步骤:
Bar.prototype.constructor = Bar;
很明显,构造b
时调用了正确的Bar
构造函数,那么这个原型(prototype)属性有什么影响呢?我很想知道将构造函数属性设置为“正确”实际上有什么实际区别——因为我看不到它对创建对象后实际调用哪个构造函数有任何影响。
最佳答案
第一步是了解constructor
和prototype
是什么。这并不难,但必须放下经典意义上的“继承”。
构造函数
constructor
属性不会在您的程序中产生任何特殊影响,除了您可以查看它以了解哪个函数与运算符new
创建您的对象。如果您键入 new Bar()
,它将是 Bar
而您键入 new Foo
,它将是 Foo
。
原型(prototype)
prototype
属性用于查找,以防相关对象没有所需的属性。如果您编写 x.attr
,JavaScript 将尝试在 x
的属性中查找 attr
。如果找不到,它将在 x.__proto__
中查找。如果它也不存在,它将在 x.__proto__.__proto__
中查找,只要 __proto__
已定义,它就会继续查找。
那么什么是 __proto__
,它与 prototype
有什么关系?简而言之,prototype
用于“类型”,而 __proto__
用于“实例”。 (我用引号说是因为类型和实例之间没有任何区别)。当您编写 x = new MyType()
时,发生的(除其他外)是 x.__proto___
被设置为 MyType.prototype
。
问题
现在,以上内容应该是您推导自己示例的含义所需要的全部内容,但要尝试回答您的实际问题; “为什么要写这样的东西”:
Bar.prototype.constructor = Bar;
我个人从未见过它,我觉得它有点傻,但在你给出的上下文中,它意味着 Bar.prototype
对象(使用 new 创建Foo(42)
) 将被视为由 Bar
而不是 Foo
创建。我想这个想法是一些类似于 C++/Java/C# 类语言的东西,其中类型查找(constructor
属性)将始终产生最具体的类型而不是更通用的类型原型(prototype)链中更上层的对象。
我的建议:不要过多考虑 JavaScript 中的“继承”。接口(interface)和混合的概念更有意义。并且不要检查对象的类型。相反,检查所需的属性(“如果它像鸭子一样走路并且像鸭子一样嘎嘎叫,它就是鸭子”)。
试图强制 JavaScript 进入经典继承模型,当它只有如上所述的原型(prototype)机制时,才是造成困惑的原因。许多建议手动设置 constructor
-property 的人可能只是试图这样做。抽象很好,但是这种手动分配构造函数属性并不是 JavaScript 的惯用用法。
关于javascript - Javascript constructor 属性的意义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4012998/
我有一张 table People (First_Name, Last_Name)。此表包含与示例中一样重复的记录(并非所有行都重复): First_Name Last_Name John
我用 Java 编写过很多程序,之前也涉足过 C++。我在各种 C++ 书籍中阅读了有关指针的内容,并完成了书籍中的各种示例。 我了解指针的基础知识,但有一件事我一直不清楚。指针在现实世界中的应用是什
线 .Mappings(m => m.FluentMappings.AddFromAssemblyOf() 它有什么作用?它会在派生自 ClassMap 的 Product 类的程序集中查找任
我有用于打印数字的自定义打印功能。我制作了一个 ASCII 版本和一个 UTF-16LE 版本。 UTF-16LE 版本对 0-9 使用全角代码/字符,对十六进制使用 A-F。在调试我的函数时,我注意
这是我的代码片段: float ab(float); 以后 if(ab(temp)
我在一个项目文件中包含以下代码: //begin of the file ((window) => { 'use strict'; class View extends GSM.Event
我一直在到处寻找关于 ? 用法的正确解释。和 *。我注意到我可以使用以下方法拒绝所有用户的访问: 如果我想允许某个组,我应该在其上方添加下一行: 但是当我看到人们使用 ? 时,我开始忘记什么意思,
我正在关注 melon js tutorial .这是在我的 HUD.js 文件的顶部。 game.HUD = game.HUD || {} 我以前在其他例子中见过这个。 namespace.some
我正在处理一个包含数千行代码的文件。我正在第 700 行实现一个算法。我经常不得不离开这些行来检查文件中的其他方法。 导航回到我实际编码的地方通常很痛苦。如果我可以在第 700 行设置一个航路点并为其
我遇到了这段代码 do { if (higherQuality && w > targetWidth) { w /= 2; if (w &
uint8_t * const LCDMem = (uint8_t *) &LCDM3; 此代码在 msp430fg4618 培训套件中用于 lcd 配置。谁能解释一下上述代码的含义? 它允许使用 a
上下文 阅读一些内核代码。 问题 我不明白这行是什么意思 *(void **) &(int[2]){0,PAGE_SIZE}; 还有更多,这是什么意思 {0,PAGE_SIZE} 对我来说,它看起来不
我正在查看 Underscore.js 的源代码库,专门用于 map方法(该页面第 85 行左右,并复制到此处): _.map = function(obj, iterator, context)
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 9
我是一名优秀的程序员,十分优秀!