JavaScript 中的对象原型
Object prototype in JavaScript
我尝试了以下代码片段:
var man = new Object();
man = {sex : 'male'}
var child = new Object(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
This returns Object {},而我期望它 return 与 man[=22= 关联的对象].然而,这个片段:
var man = Object.create(null);
man = {sex : 'male'}
var child = Object.create(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
它执行 return 与 man 关联的对象。从概念上讲,我哪里错了?
造成差异的原因在于它指定要执行的操作。 Object
构造函数只是将其参数强制转换为一个对象——它不对原型做任何事情:
When the Object constructor is called with no arguments or with one argument value, the following steps are taken:
1. If value is supplied, then
a. If Type(value) is Object, then
i. If the value is a native ECMAScript object, do not create a new object but simply return value.
http://es5.github.io/#x15.2.2.1
Object.create
另一方面,设置原型:
- If
Type(O)
is not Object
or Null
throw a TypeError
exception.
- Let obj be the result of creating a new object as if by the expression
new Object()
where Object
is the standard built-in constructor with that name
- Set the
[[Prototype]]
internal property of obj to O.
http://es5.github.io/#x15.2.3.5
我认为概念上的误区在于你认为new Object()
所做的事情。如果将对象传递给 new Object()
,新对象将具有该对象具有的任何属性。但是,它并没有用原始对象的原型创建一个新对象,它只是取每个 属性 并将其添加到新创建的对象中。
我尝试了以下代码片段:
var man = new Object();
man = {sex : 'male'}
var child = new Object(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
This returns Object {},而我期望它 return 与 man[=22= 关联的对象].然而,这个片段:
var man = Object.create(null);
man = {sex : 'male'}
var child = Object.create(man);
child.firstName = 'foo'
child.lastName = 'bar'
Object.getPrototypeOf(child);
它执行 return 与 man 关联的对象。从概念上讲,我哪里错了?
造成差异的原因在于它指定要执行的操作。 Object
构造函数只是将其参数强制转换为一个对象——它不对原型做任何事情:
When the Object constructor is called with no arguments or with one argument value, the following steps are taken:
1. If value is supplied, then
a. If Type(value) is Object, then
i. If the value is a native ECMAScript object, do not create a new object but simply return value. http://es5.github.io/#x15.2.2.1
Object.create
另一方面,设置原型:
- If
Type(O)
is notObject
orNull
throw aTypeError
exception.- Let obj be the result of creating a new object as if by the expression
new Object()
whereObject
is the standard built-in constructor with that name- Set the
[[Prototype]]
internal property of obj to O.
http://es5.github.io/#x15.2.3.5
我认为概念上的误区在于你认为new Object()
所做的事情。如果将对象传递给 new Object()
,新对象将具有该对象具有的任何属性。但是,它并没有用原始对象的原型创建一个新对象,它只是取每个 属性 并将其添加到新创建的对象中。