Object.create()JavaScript
我引用了JavaScript权威指南第6.1.4节Object.create()中的这句话。我觉得下面的说法不太清楚 您可以传递null来创建一个没有原型的新对象,但如果这样做,新创建的对象将不会继承任何东西,甚至不会继承toString()之类的基本方法(这意味着它也不会使用+运算符)Object.create()JavaScript,javascript,oop,object,methods,javascript-objects,Javascript,Oop,Object,Methods,Javascript Objects,我引用了JavaScript权威指南第6.1.4节Object.create()中的这句话。我觉得下面的说法不太清楚 您可以传递null来创建一个没有原型的新对象,但如果这样做,新创建的对象将不会继承任何东西,甚至不会继承toString()之类的基本方法(这意味着它也不会使用+运算符) var o2=Object.create(null)//o2不继承任何道具或方法。您正在对number属性调用toString,该属性不是对象本身。如果您尝试o2.toString(),它将不起作用。您正在对
var o2=Object.create(null)//o2不继承任何道具或方法。
您正在对number属性调用toString
,该属性不是对象本身。如果您尝试o2.toString()
,它将不起作用。您正在对number属性调用toString
,该属性不是对象本身。如果您尝试o2.toString()
,它将不起作用。toString
在您的示例中起作用,因为您是在数字上运行它,而不是在对象本身上运行它
它之所以有效,是因为它与此没有什么不同:
var n = 1;
console.log(n.toString());
要查看无原型的结果,请尝试以下操作:
var o2 = Object.create(null);
console.log(o2.toString());
toString
在您的示例中起作用,因为您是在数字上运行它,而不是在对象本身上运行它
它之所以有效,是因为它与此没有什么不同:
var n = 1;
console.log(n.toString());
要查看无原型的结果,请尝试以下操作:
var o2 = Object.create(null);
console.log(o2.toString());
当你这么做的时候
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您正在创建一个名为number
的属性,并将该属性添加到o2
对象中
当你这么做的时候
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您正在执行的toString
不是在o2
上,而是在属性o2.number
上
如果你这样做
console.log(typeof o2.number)
。。。您将看到,o2.number
具有类型number
,因此具有与数字关联的所有方法
如果你这样做
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您将看到o2
具有类型object
如果您尝试执行o2.toString
,您将得到一个错误,并看到此对象确实没有任何名为toString
的方法
注: 根据我的经验,你可能从来都不想做像
var o2 = Object.create(null);
o2.number = 1;
var o2 = Object.create(Object.prototype);
o2.number = 1;
相反,你可能想要的是
var o2 = Object.create(null);
o2.number = 1;
var o2 = Object.create(Object.prototype);
o2.number = 1;
。。。可以写得更优雅,比如
var o2 = {
number : 1
};
创建不从Object.prototype
继承的对象几乎没有什么好处。如果其他人最终使用了您的代码,那么当其他开发人员试图在您的对象上调用例如hasOwnProperty
或toString
时,您很可能会把他们搞糊涂,他们会得到一个错误(因为他们希望这些方法适用于任何对象)。如果您这样做
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您正在创建一个名为number
的属性,并将该属性添加到o2
对象中
当你这么做的时候
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您正在执行的toString
不是在o2
上,而是在属性o2.number
上
如果你这样做
console.log(typeof o2.number)
。。。您将看到,o2.number
具有类型number
,因此具有与数字关联的所有方法
如果你这样做
o2.number = 1
o2.number.toString()
console.log(typeof o2)
。。。您将看到o2
具有类型object
如果您尝试执行o2.toString
,您将得到一个错误,并看到此对象确实没有任何名为toString
的方法
注: 根据我的经验,你可能从来都不想做像
var o2 = Object.create(null);
o2.number = 1;
var o2 = Object.create(Object.prototype);
o2.number = 1;
相反,你可能想要的是
var o2 = Object.create(null);
o2.number = 1;
var o2 = Object.create(Object.prototype);
o2.number = 1;
。。。可以写得更优雅,比如
var o2 = {
number : 1
};
创建不从Object.prototype
继承的对象几乎没有什么好处。如果其他人最终使用了你的代码,那么当其他开发人员试图在你的对象上调用例如hasOwnProperty
或toString
时,你很可能会把他们搞糊涂,他们会得到一个错误(因为这些方法期望对任何对象都存在)。object.getPrototypeOf(o2.number)==Number.prototype
Object.getPrototypeOf(o2.Number)===Number.prototype