javascript - javascript中普通对象变量和原型(prototype)变量的区别

标签 javascript prototype

在 javascript 中,当我在对象中创建变量时有什么区别,如下两种方式

user.name = 'hello';

user.prototype.name = 'hello';

最佳答案

从根本上来说,没有任何属性,因为在这两种情况下,您都在创建或修改对象的属性。但创建/修改该属性的影响可能很大。

首先,请注意,如果 user 是一个函数*(或者您在另一种对象上创建了一个函数),则该属性只有一个名为 prototype 的属性。我将假设 user 是这个答案其余部分的函数。由于我们使用 user 作为构造函数,因此我将使用 User 代替本答案的其余部分,因为 JavaScript 中压倒性的约定是构造函数的名称以大写字符开头。

如果您通过new User创建对象,则使用

User.prototype。在这种情况下,User.prototype 引用的对象将用作新对象的原型(prototype)。这意味着,如果您尝试检索该新对象上的属性值,并且该对象没有给定名称的属性,则 JavaScript 引擎将查看该对象的原型(prototype)以尝试找到它。

因此,在 User.prototype 上添加或修改属性可能似乎将其添加到您通过new User创建的对象中:

function User() {
}
var u1 = new User();
console.log(u1.name); // undefined
User.prototype.name = "hello";
console.log(u1.name); // "hello"

它实际上并没有被添加到 u1 中,只是因为 u1 没有自己的 name 属性,当我们在其上查找name,并使用其原型(prototype)中的属性。

要进一步了解函数的 prototype 属性与对象原型(prototype)之间的关系,请参阅 __proto__ VS. prototype in JavaScript .


* 它需要是通过 functionclass 关键字创建的函数,默认具有 prototype 属性;箭头函数、async 函数和方法默认没有 prototype,不能用作构造函数。

关于javascript - javascript中普通对象变量和原型(prototype)变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48050041/

相关文章:

javascript - 将数据保存在构造函数中以供跨多个对象使用

使用原型(prototype)时的 Javascript 继承问题 - 实例被覆盖 :(

javascript - 没有jquery突出导航

javascript - Angular Material 设计有效/无效输入

Javascript , jQuery - 我做错了什么?

javascript - Nodejs中的Mongodb Tailable Cursor,如何停止流

javascript - 如何覆盖javascript的cloneNode?

javascript - 我想编写一个具有良好结构的代码。但我不能

javascript - 为什么下面的 `constructor`指向Object?

javascript - 隐藏列时调整第 nth-child 属性