JavaScript 继承和对象属性

标签 javascript node.js

我正在自学 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/

相关文章:

javascript - Protractor中使用describe或it时,使用function()和()有什么区别

javascript - Webpack 5 和 ESM

javascript - 在 Sails Express js 中,除了异步处理之外,AJAX/AJAJ 的意义何在?

angularjs - Streaming-s3 无法在实时 -Nodejs 上运行

javascript - 使用带有简单 html 链接的 window.location

javascript - 在数组中找到精确的数字匹配?

node.js - 捕获 socket.io 服务器关闭错误

node.js - 为什么我的代码先打印 'download over',然后开始下载html页面?

javascript - 使用 JSON 和 JQuery 合并和分组表

javascript - Sequelize - 将模型映射到字段