gpt4 book ai didi

javascript - javascript构造函数和object.create可以结合使用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:00:47 24 4
gpt4 key购买 nike

更新

如果这不可能,请随时提供答案并解释原因。我很乐意将其标记为已接受。


我想稍微简化一下下面的代码(一个对象“声明”有两个步骤,我想有一个):

var Masher = function(opts) {
this._name = opts.name;
};

Masher.prototype = Object.create(Object.prototype, {
_name: { writable: true },
name: { get: function() { return this._name; }}
});

// Note: (new Masher({name: 'bar'})).name == 'bar'

我想一次性创建整个函数原型(prototype),构造函数出现在 Object.create 中的某处。也许,像这样:

var Basher = Object.create(Function.prototype, {
_name: { writable: true },
name: { get: function() { return this._name; }},
constructor: { value: function(opts) { this._name = opts.name; }}
});

但是,当我调用 new Basher() 时,我得到:'TypeError: object is not a function'。

虽然我意识到我可以使用语法糖(一个辅助库)来做到这一点,但我的目标是让事情尽可能简单,并获得对 JS 对象、原型(prototype)、构造函数内部结构的一些理解。我已尝试尽可能多地阅读此内容:SO related questions , Crockford , Ben Nadel , Joost Diepenmaat .

也许我还没有找到正确的表述,或者我正在与 Object.create 的设计理念作斗争,或者语言不允许这样做。也许,这真的只是一种风格上的东西,因此是一种自负。

当然,我可以接受两步过程 (Masher)。将所有内容打包在一个镜头中感觉不错(Basher)。

有没有办法做到这一点?谢谢。

最佳答案

如果你想使用基于类的方法,你可以用 new 调用构造函数,你总是有两个部分:

  • 构造函数本身(初始化实例)
  • 原型(prototype)对象(共享属性)

如果你不想完全放弃原型(prototype),没有 JavaScript 语法可以一次性完成函数创建和原型(prototype)设置(除了新的 ES6 class 语法,当然),同时仍然保持从函数到原型(prototype)对象的 .prototype 链接。当然,一个简单的辅助函数(不需要是一个完整的库)就可以:

function Class(p) {
return (p.constructor.prototype = p).constructor;
}
var Casher = Class({
constructor: function(opt) { this._name = opt.name },
get name() { return this._name }
});
var foo = new Casher({name:'bar'});

这个模式与 Object.create 根本没有太多关系(除非你希望你的原型(prototype)继承自另一个原型(prototype))。

所以是的,也许您正试图与 Object.create 的哲学作斗争,即仅使用对象并从中派生其他对象(阅读其中的 Wikipedia article 并确保查看 JS 以外的其他语言的一些示例)。您不会有构造函数,也不会有 new 运算符 - 而是您会在对象上调用 create 方法:

var Proto = { // some helper methods (usually native in more prototype-focused languages)
clone: function() {
return Object.create(this);
},
create: function(opt) {
var derived = this.clone();
derived.init(opt);
return derived;
},
init: function(opt) {
Object.getOwnPropertyNames(opt).forEach(function(p) {
Object.defineProperty(this, p, Object.getOwnPropertyDescriptor(opt, p));
}, this);
}
};

var Pasher = Proto.create({ // "subclass" Proto
init: function(opt) {
if ("name" in opt) this._name = opt.name;
},
_name: "",
get name() { return this._name; }
});
var foo = Pasher.create({name:'bar'});

关于javascript - javascript构造函数和object.create可以结合使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26218520/

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