gpt4 book ai didi

javascript - 为什么在扩展对象时使用 Object.create 作为原型(prototype)?

转载 作者:数据小太阳 更新时间:2023-10-29 06:12:03 24 4
gpt4 key购买 nike

我有 Java 背景,最近一直在尝试 JavaScript 继承。我开始编写一些对象,在阅读了一些示例后,我找到了最适合我的代码风格。

这是我的:

var Class = function() {};
Class.extend = function(p_constructor) {
var Superclass = this;
// the following line confuses me
p_constructor.prototype = Object.create(Superclass.prototype);
p_constructor.prototype.constructor = p_constructor;
p_constructor.extend = Superclass.extend;
return p_constructor;
};

所以现在当我想定义一个扩展类的对象时,我只需输入:

var Person = Class.extend(function(p_firstName, p_lastName) {
this.firstName = p_firstName;
this.lastName = p_lastName;
});

以下为真:

var p = new Person('john', 'smith');
p instanceof Person; // true
p instanceof Class; // true

我只是难以理解 Class.extend 函数中以下几行之间的有效区别:

/* 1) */ p_constructor.prototype = new Superclass();
/* 2) */ p_constructor.prototype = Superclass.prototype;
/* 3) */ p_constructor.prototype = Object.create(Superclass.prototype);
/* 4) */ p_constructor.prototype = Object.create(Superclass);

我确实意识到如果某些 super 构造函数抛出错误,使用第一行并不是很明智,但是第二行、第三行和第四行之间到底有什么区别?

最佳答案

回答我自己的问题:

/* 1) */ p_constructor.prototype = new Superclass();

正如我所说,使用它不是很明智,因为它实际上创建了整个 Superclass 对象。原型(prototype)继承的全部意义在于共享原型(prototype)对象,从而避免冗余函数(有时是对象)定义。

/* 2) */ p_constructor.prototype = Superclass.prototype;

如果您可以确定构造函数的原型(prototype)永远不会被第三方修改,那就没问题了。假设使用您的类的人想要向其原型(prototype)添加额外的功能。更改 p_constructor 的原型(prototype)将直接影响父类(super class)的原型(prototype),并可能在父类(super class)的行为中引入错误。所以改用下一行代码:

/* 3) */ p_constructor.prototype = Object.create(Superclass.prototype);

这将创建一个新对象(实例),其原型(prototype)(实际上是 __proto__ 变量)设置为父类(super class)的原型(prototype)。对 p_constructor.prototype 的任何更改现在都不会更改父类(super class)的行为。

/* 4) */ p_constructor.prototype = Object.create(Superclass);

上面一行有效,但没有意义,因为它只是将原型(prototype)设置为父类(super class)的构造函数。

另外,下面一行也让我感到困惑:

p_constructor.prototype.constructor = p_constructor;

它对 p_constructor 的行为没有影响,它只是使对构造函数的引用在实例化对象中可用。一个巧妙的技巧是将父类(super class)也添加到原型(prototype)中:

p_constructor.prototype.superclass = Superclass;

然后下面的代码就可以工作了:

function Constructor(p_params) {
// call constructor of the superclass
this.superclass(p_params);
}

关于javascript - 为什么在扩展对象时使用 Object.create 作为原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18547693/

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