在javascript中,当我在对象中创建一个变量,如下面2种方式
时,差异是什么preventDefault
答案 0 :(得分:3)
从根本上说,没有任何内容,因为在这两种情况下,您都要在对象上创建或修改属性。但是创建/修改该属性的效果可能很大。
首先,请注意user
只有一个名为prototype
的属性,如果它是一个函数*(或者如果您在另一种对象上创建了一个)。我将假设user
是此答案的其余部分的函数。由于我们使用user
作为构造函数,我将使用User
代替其余的答案,因为JavaScript中的压倒性约定是构造函数的名称以一个大写的字符。
User.prototype
创建对象,则会使用 new User
。在这种情况下,User.prototype
引用的对象将用作新对象的原型。这意味着如果您尝试在该新对象上检索属性的值并且该对象没有具有给定名称的属性,则JavaScript引擎将查看该对象的原型以尝试查找它
因此,在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
属性与对象原型之间的关系,请参阅__proto__
VS. prototype in JavaScript。
*它必须是通过function
或class
关键字创建的函数,默认情况下具有prototype
属性;箭头函数,async
函数和方法默认情况下不具有prototype
,不能用作构造函数。
答案 1 :(得分:1)
第一种情况:
WeekendAssignmentsSpecified
如果您创建了这样的对象:
WeeklyAssignmentsSpecified
然后你执行user.name =' hello',只需将属性添加到用户对象
user.name = 'hello'
第二种情况:
var user = { id:'abc'};
如果您使用构造函数创建了一个对象; 例如;
user{name:'hello',id:'abc'}
现在:
user.prototype.name = 'hello';
将初始化名称为hello的任何用户实例。当我们希望实例具有相同的属性并且在方法的情况下只有一个副本时,我们使用原型。 例如
function User(id) {
this.id = id;// creating an object which will differ in id;
}