在 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 .
* 它需要是通过 function
或 class
关键字创建的函数,默认具有 prototype
属性;箭头函数、async
函数和方法默认没有 prototype
,不能用作构造函数。
关于javascript - javascript中普通对象变量和原型(prototype)变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48050041/