Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Object.create()JavaScript_Javascript_Oop_Object_Methods_Javascript Objects - Fatal编程技术网

Object.create()JavaScript

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(),它将不起作用。您正在对

我引用了JavaScript权威指南第6.1.4节Object.create()中的这句话。我觉得下面的说法不太清楚

您可以传递null来创建一个没有原型的新对象,但如果这样做,新创建的对象将不会继承任何东西,甚至不会继承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