普通对象变量和原型变量javascript之间的区别

时间:2018-01-01 13:24:48

标签: javascript prototype

在javascript中,当我在对象中创建一个变量,如下面2种方式

时,差异是什么
preventDefault

2 个答案:

答案 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

*它必须是通过functionclass关键字创建的函数,默认情况下具有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;
}