- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有这个功能:
函数 Foo(){}
根据这张图片:
>> Foo.prototype -> Foo {}
所以如果我写:
Foo.prototype.constructor
现在 - 它引用创建 Foo{}
对象的构造函数,该对象是 function Foo(){}
一切正常。
那么问题在哪里呢?
Foo.prototype
是一个对象实例 --> Foo {}
Foo{}
的构造函数是谁?
它是 function Foo(){}
你可以在这里看到它是黄色的:
好的
但有人告诉我here那:
所以 Foo.prototype.__proto__
应该引用 function Foo(){}
的 prototype
而不是 Object。原型(prototype)
!
如果我翻译它:
__proto__ is the ctor's prototype
_________________________________________________________________________________________
Foo.prototype.__proto__ is the function Foo(){} Foo.prototype
但这是错误的
我可能错了,因为:
我错过了什么?
最佳答案
注意:首先,__proto__
是非标准的,使用 Object.getPrototypeOf
,虽然为了简短,而且因为我很懒,我确实使用了prototype
在这个答案中出现了很多次
好吧,如果我没看错的话,你会被最初的假设所抛弃:
Foo.prototype -> Foo{}
根据定义,Foo
的原型(prototype)(它是一个构造函数)是 Foo
的一个实例。但是,因为构造函数是一个函数,并且构造函数返回一个特定实例的对象,所以无论哪种方式,原型(prototype)都将是一个增强的 Object
。
我不太喜欢将原型(prototype)继承与经典 OOP 进行比较,但可以这样想:
Foo
原型(prototype)是一种可变类定义(您可以在进行过程中添加方法和属性),构造函数创建一个增强该原型(prototype)的对象,并在实例级别添加另一层属性/方法。
因此 Foo.prototype instanceof Foo
为真。但是,Foo
是一个对象:
Object.getPrototypeOf(Foo.prototype) === Object.prototype
是真的。正如
Object.getPrototypeOf(Array.prototype) === Object.prototype.
将其翻译成 JS(原型(prototype))-speak,您会得到如下内容:
对于 JS 创建的每个函数对象,该对象都被分配了一个 prototype
属性。 prototype
属性是 Object
的实例,但它有 1 个特殊属性。
如果试图访问一个对象的属性或方法,而 JS 找不到在实例级别定义的这个属性,JS 将尝试解析原型(prototype)属性上的名称:
instance.nonExistantProperty;
//js scans instance variable, doesn't find property:
instance.prototype.nonExistantProperty
//js uses prototype, if not found:
instance.prototype.prototype.nonExistantProperty
//all the way up to Object.prototype, which does not have a prototype, so here an exception is raised (TypeError is thrown)
这是我从 one of my older posts here 中复制的此查找的简短示意图。 , 可能值得一看,也可以查看底部的链接答案,他们对此事进行了更详细的介绍
[ F.divide ]<=========================================================\ \
F[divide] ===> JS checks instance for property divide | |
/\ || | |
|| || --> property found @instance, return value-------------------------------| |
|| || | |
|| ===========> Function.prototype.divide could not be found, check prototype | |
|| || | |
|| ||--> property found @Function.prototype, return-----------------------| |
|| || | |
|| ==========> Object.prototype.divide: not found check prototype? | |
|| || | |
|| ||--> property found @Object.prototype, return---------------------|_|
|| || |=|
|| =======>prototype is null, return "undefined.divide"~~~~~~~~~~~~~~~|X|
|| \ /
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~< TypeError can't read property 'x' of undefined
基本上就是这样。
现在,对于为什么 Foo.prototype.constructor
引用 Foo
函数,您可能也有点受挫。
同样,这很容易,因为每个实例都应该包含您可能需要的所有信息,以确定您正在处理的对象类型:
function Foo{}
var inst = new Foo();
console.log(inst.constructor);//references the constructor function
请记住,Foo
返回的所有实例都返回一个对象,该对象引用所有 prototype
属性,以及(可选)实例级别的一些属性。
那么,您为什么还要费心创建这样的实例呢?同样,这非常简单:更改实例不会更改原型(prototype):
console.log(Foo.prototype.constructor === inst.constructor);//true
inst.constructor = function(){};//override constructor property
console.log(Foo.prototype.constructor === inst.constructor);//false, prototype did not change
关于Javascript __proto__ - 澄清?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19677348/
我的理解是 Object.__proto__ 是 javascript 中的“顶级”原型(prototype)对象。我希望它的 __proto__ 为空,但在谷歌浏览器中(没有尝试过其他浏览器),它不
为什么 Object.__proto__ === Function.__proto__ 在 JavaScript 中? 这样设计的目的是什么? 最佳答案 __proto__ property对象的原型
我一直在研究 prototype chain在 Javascript 中,这个主题让我想知道...是否有一个通用名称或术语来指代原型(prototype)链末尾的所有其他对象? 我正在 GitHub
似乎在 JavaScript (ES6) 类中 super.__proto__ === this.__proto__ . 您能解释一下为什么会出现这种情况吗?该行为在不同浏览器中似乎是一致的,因此我怀
为什么如果F - 简单函数: F.prototype !== F.__proto__ 但是 Function.prototype === Function.__proto__ ? 最佳答案 F.pro
obj.prototype.__proto__ = events.EventEmitter.prototype 我有时会看到上面的代码,我用谷歌搜索了一下,他们说这一行将所有 EventEmitter
曾经能够毫无问题地做到这一点: for (data in dataArray) { // do some stuff }; 现在,它突然迭代这个 __proto__添加到我的 dataArray 的数
我正在阅读 __proto__ 和 prototype 对象之间的区别,但是当我尝试访问 __proto__ 的实例时一个对象,它返回给我 undefined。 下面是我写的代码: function
当一个对象被实例化时,无论是字符串/函数/等等,__proto__属性(property)包括在内。该属性似乎是由 __proto__ 生成的Object.prototype 中的访问器... Obj
__proto__ 已弃用。为什么像谷歌浏览器这样的大型浏览器仍在使用它?有没有计划倾倒它? 最佳答案 在语言/框架中最难做的事情之一实际上是删除已弃用的功能。世界上仍然有大量代码依赖于此功能。删除它
function makeAdder(x) { return function(y) { return x + y; }; } var add5 = makeAdder(5); add
我正在重新从头开始学习 JavaScript/做个人笔记,并遇到了一些我想要一些解释的东西。 谁能解释一下: Object.prototype.hasOwnProperty("__proto__");
下面是一些示例,展示了基于对象定义和创建方式的原型(prototype)继承的不同行为。我区分对象的“原型(prototype)属性”,例如someObject.prototype 和“原型(prot
我正在尝试使用带有继承的揭示模块模式。我似乎让它工作正常,但它使用“__proto__”,我知道它被认为已被弃用。有没有更好的方法来创建继承而不使用“__proto__”? var Person =
函数getBooks已在Author.prototype中定义。但它不能在 Author 对象中使用。当我使用 __proto__ 继承 Person 属性时。为什么Author对象没有getBook
我有这个功能: 函数 Foo(){} 根据这张图片: >> Foo.prototype -> Foo {} 所以如果我写: Foo.prototype.constructor 现在 - 它引
什么时候 __proto__ 有用? 很多浏览器都支持它,但由于不是所有浏览器都支持,所以程序员似乎害怕使用它。我从未在任何代码中看到它(例如库 jQuery 和 backbone.js)。 什么时候
当我创建一个空白对象时: var o = {}; 为什么新建对象时看不到'__proto __'对象,但添加函数时可以? 编辑:为了完整起见,要创建一个真正的空白对象(没有原型(prototype)链
Object.each , Object.keys , ... 当我尝试与作为类属性的对象一起使用时无法正常工作,请检查 this example : var map = {a: 1, b: []};
在 __proto__ 周围使用方括号时在一个对象中,__proto__是可枚举的。未提供方括号时,__proto__是不可枚举的。 例子: obj = {"__proto__": "Hello"}
我是一名优秀的程序员,十分优秀!