gpt4 book ai didi

javascript - 在没有 __proto__ 的情况下配置 [[Prototype]] 链

转载 作者:行者123 更新时间:2023-11-29 21:51:29 25 4
gpt4 key购买 nike

我想写一个函数来配置原型(prototype)链,但我想避免直接使用__proto__Object.setPrototypeOf。这可以做到吗?如果不是,从性能 Angular 来看哪个更可取?

此外,将其描述为 mixin 的实现是否正确?

这就是我所拥有的(使用 __proto__):

function mix(fn) {

var ancestorFns, curr

if (typeof fn !== 'function') {
throw 'fn must be a function.';
}

ancestorFns = Array.prototype.slice.call(arguments, 1);
curr = fn.prototype;

ancestorFns.forEach(function(ancestorFn) {

if (typeof ancestorFn !== 'function') {
throw 'ancestorFn must be a function.';
}

curr = curr.__proto__ = ancestorFn.prototype;

});

}

用法:

function Foo() {}
Foo.prototype.a = 'a';

function Bar() {}
Bar.prototype.b = 'b';

function Bam() {}
Bam.prototype.c = 'c';

mix(Foo, Bar, Bam);
console.dir(Foo.prototype); // { a: 'a' }
console.dir(Foo.prototype.__proto__); // { b: 'b' }
console.dir(Foo.prototype.__proto__.__proto__); // { c: 'c' }

最佳答案

要配置原型(prototype)链,请写入构造函数的 .prototype 属性,而不是改变现有原型(prototype)对象的 [[prototype]]。当然,您需要将所有自己的属性从旧原型(prototype)复制到新原型(prototype),这通常是在继承过程完成后才设置的。

is it correct to describe this as an implementation of mixins?

没有。 Mixins 不会改变继承自的对象。您的函数不执行多重继承(其中 Foo 继承自 BarBam),而是执行单个继承链(其中 Foo 继承自BarBar 继承自Bam)。

当然,您的函数使用原型(prototype)继承,而术语“mixin”指的是将方法复制到对象(至少在 JS 中)。

Can this be done?

我会通过这个(相当标准的)实现:

function inherit(child, parent) {
if (arguments.length > 2)
parent = inherit.apply(this, Array.prototype.slice.call(arguments, 1));

child.prototype = Object.create(
parent.prototype,
// get all property descriptor objects from the old child.prototype
// will include `constructor` and all manually set properties
Object.getOwnPropertyNames(child.prototype).reduce(function(m, n) {
m[n] = Object.getOwnPropertyDescriptor(child.prototype, n);
return m;
}, {})
);
return child;
}

Is either preferable from a performance persepctive?

我不确定改变原型(prototype)对象的 [[prototype]] 到底有多糟糕——如果它是在构造任何实例之前完成的话。您应该自己测试一下,我很确定您不会获得巨大的性能差异。当然,__proto__ 的主要缺点是并非所有浏览器都支持它。

关于javascript - 在没有 __proto__ 的情况下配置 [[Prototype]] 链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946947/

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