gpt4 book ai didi

javascript - 为什么在 javascript 中使用链式原型(prototype)继承?

转载 作者:可可西里 更新时间:2023-11-01 02:45:58 25 4
gpt4 key购买 nike

perf

为什么我们构建原型(prototype)继承链而不是使用对象组合。通过原型(prototype)查找链中的每一步都非常昂贵。

这是一些虚拟示例代码:

var lower  = {
"foo": "bar"
};

var upper = {
"bar": "foo"
};

var chained = Object.create(lower, pd(upper));

var chainedPrototype = Object.create(chained);

var combinedPrototype = Object.create(pd.merge(lower, upper));

var o1 = Object.create(chainedPrototypes);
var o2 = Object.create(combinedPrototypes);

使用pd因为属性描述符非常冗长。

o2.fooo1.foo 快,因为它只在两个原型(prototype)链上,而不是三个。

既然沿着原型(prototype)链向上移动是昂贵的,为什么我们要构造一个原型(prototype)链而不是使用对象组合?

另一个更好的例子是:

var Element = {
// Element methods
}

var Node = {
// Node methods
}

var setUpChain = Object.create(Element, pd(Node));
var chained = Object.create(setUpChain);
var combined = Object.create(pd.merge(Node, Element));

document.createChainedElement = function() {
return Object.create(chained);
}

document.createCombinedElement = function() {
return Object.create(combined);
}

我没有看到任何代码合并原型(prototype)对象以提高效率。我看到很多代码构建链式原型(prototype)。为什么后者更受欢迎?

我能想到的唯一原因是使用 Object.isPrototypeOf 来测试链中的各个原型(prototype)。

除了 isPrototypeOf 之外,使用继承比组合有明显的优势吗?

最佳答案

主要原因必须是对原型(prototype)对象的更改。对祖先对象的更改将反射(reflect)在整个链中。可以想象,这可能是一个好处。虽然我无法立即想到任何真实世界的实例,但我认为拥抱这种动态特性可以提供其他(阅读:基于类的)语言根本无法提供的动态。

原型(prototype)链上层的对象可以在应用程序的整个生命周期中根据需要进行演变,并且这些更改将反射(reflect)在所有后代对象中。这可以很容易地与作为一流对象的 JavaScript 函数结合,以根据需要动态修改功能。

也就是说,如果不需要此功能,则没有理由使用原型(prototype)链而不是组合。

关于javascript - 为什么在 javascript 中使用链式原型(prototype)继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7294276/

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