我正在自学 JavaScript,但我对 JavaScript 中的整个原型(prototype)和继承感到困惑。
示例1:
function MyClass() {
this.my_var = "1";
}
function MyClass2() {
this.my_var2 = "2";
}
MyClass2.prototype = new MyClass();
class2 = new MyClass2();
console.log(class2.my_var);
console.log(class2.my_var2);
这是最容易理解的。 MyClass2 的原型(prototype)是一个 MyClass 对象,因此 class2 可以访问它的属性似乎很自然。
示例2:
我想知道是否可以在构造函数本身中设置原型(prototype):
function MyClass() {
this.my_var = "1";
}
function MyClass2() {
this.my_var2 = "2";
this.prototype = new MyClass();
}
class2 = new MyClass2();
console.log(class2.my_var);
console.log(class2.my_var2);
但这似乎不起作用。 my_var 似乎未定义。
示例3:
让我们尝试另一种方法,这次使用 Object.create():
function MyClass() {
this.my_var = "1";
}
function MyClass2() {
this.my_var2 = "2";
}
MyClass2.prototype = Object.create(MyClass);
class2 = new MyClass2();
console.log(class2.my_var);
console.log(class2.my_var2);
也不走运,my_var 似乎未定义。
示例 4:
这次,我使用“util”模块中的 NodeJS“inherits()”函数:
util = require("util");
function MyClass() {
this.my_var = "1";
}
function MyClass2() {
this.my_var2 = "2";
}
util.inherits(MyClass2, MyClass);
class2 = new MyClass2();
console.log(class2.my_var);
console.log(class2.my_var2);
我明白为什么示例 1 有效,但我不明白为什么 2,3 和 4 不起作用。我希望有人能向我解释为什么会这样。
最佳答案
示例 2:
this
关键字是对对象实例的引用。这是用new
创建的对象。您不能在构造函数中设置原型(prototype),因为在使用 new
关键字时,对象的 prototype
被用作创建新对象的原型(prototype)。所以... MyClass
的原型(prototype)在创建新对象时使用,并且 this
引用了 instanceof
MyClass
.
.prototype
属性特定于函数,它是一个被复制到该函数/类的实例化对象的对象。
示例 3:
Object.create()
从另一个对象创建对象,并且您传入的函数可能是一个对象,但您得到的不是对象的克隆,而是函数对象的克隆。但您想要的对象是函数/类的实例。
因此,如果您输入:Object.create(MyClass).__proto__
,您会看到它是一个函数。 __proto__
是特殊的内部对象原型(prototype),代表评估脚本后的情况。您可以进行实验操作,但不建议在生产中进行操作。您可以使用 new MyClass
修复此示例。
示例 4:
您需要将 MyClass.call(this);
添加为 MyClass2
函数中的第一行。
关于JavaScript 继承和对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34636913/