gpt4 book ai didi

javascript - Crockford 的对象创建技术发生了什么?

转载 作者:行者123 更新时间:2023-12-03 01:28:36 26 4
gpt4 key购买 nike

只有 3 行代码,但我无法完全理解这一点:

Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
newObject = Object.create(oldObject);

(来自 Prototypal Inheritance )

  1. Object.create() 首先创建一个名为 F 的空函数。我认为函数是一种对象。这个 F 对象存储在哪里?我想在全局范围内。

  2. 接下来,我们的 oldObject(作为 o 传入)将成为函数 F 的原型(prototype)。函数(即对象)F 现在从我们的 oldObject 中“继承”,从某种意义上说,名称解析将通过它进行路由。很好,但我很好奇对象的默认原型(prototype)是什么,Object?对于函数对象来说也是如此吗?

  3. 最后,F被实例化并返回,成为我们的newObject。这里的 new 操作是绝对必要的吗? F 不是已经提供了我们需要的东西,还是函数对象和非函数对象之间存在关键区别?显然,使用这种技术不可能有一个构造函数。

下次调用 Object.create() 时会发生什么?全局函数F是否被覆盖?当然它不会被重用,因为这会改变以前配置的对象。如果多个线程调用 Object.create() 会发生什么,是否有任何类型的同步来防止 F 上的竞争条件?

最佳答案

1) Object.create() starts out by creating an empty function called F. I'm thinking that a function is a kind of object. Where is this F object being stored? Globally I guess.

不,它存储在 Object.create 函数的本地范围内,每次调用 Object.create 这个函数 F 都会被重新创建。

您甚至可以通过将 F 存储在闭包上并重用它来创建内存效率更高的实现:

if (typeof Object.create !== "function") {
Object.create = (function () {
function F() {} // created only once
return function (o) {
F.prototype = o; // reused on each invocation
return new F();
};
})();
}

2) Next our oldObject, passed in as o, becomes the prototype of function F. Function (i.e., object) F now "inherits" from our oldObject, in the sense that name resolution will route through it. Good, but I'm curious what the default prototype is for an object, Object? Is that also true for a function-object?

所有对象都有一个构建原型(prototype)链的内部属性,这个属性被称为[[Prototype]],它是一个内部属性,尽管有些实现允许你访问它,比如mozilla,使用 obj.__proto__ 属性。

创建新对象时,默认的[[Prototype]],即var obj = {};Object.prototype

所有函数都有一个 prototype 属性,当函数用作 Constructor 时使用此属性。 ,使用 new 运算符调用。

它在幕后创建一个新的对象实例,并且该对象[[Prototype]]被设置为其构造函数的prototype属性。

3) Finally, F is instantiated and returned, becoming our newObject. Is the "new" operation strictly necessary here? Doesn't F already provide what we need, or is there a critical difference between function-objects and non-function-objects? Clearly it won't be possible to have a constructor function using this technique.

是的,new 运算符在此方法中至关重要。

new 运算符是设置对象的[[Prototype]] 内部属性的唯一标准方法,如果您对它的工作原理感到好奇,您可以看看[[Construct]]内部运作。

What happens the next time Object.create() is called? Is global function F overwritten? Surely it is not reused, because that would alter previously configured objects. And what happens if multiple threads call Object.create(), is there any sort of synchronization to prevent race conditions on F?

下次调用 Object.create 时,只会在方法调用的范围内实例化一个新的本地 F 函数,您不必担心 竞争条件

请注意,此实现几乎不符合 ECMAScript 5th Edition Specification 中描述的 Object.create ,在该方法中,您可以传递属性描述符来初始化对象。

所有浏览器 vendor 都在实现它(已经在 Firefox 3.7 alpha、最新的 Wekit Nightly Builds 和 Chrome 5 Beta 上提供),因此我建议您至少在覆盖它之前检查一下是否存在 native 实现。

关于javascript - Crockford 的对象创建技术发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com