一、Object.create()
Object.create():是Object的内置方法,可以创建一个新对象,使用现有的对象来提供新创建的对象__proto__
Object.create ( proto, [ propertiesObject ] )
- proto: 是一个对象,作为新建对象的原型
- propertiesObject :是一个对象,该对象的属性名称是新创建的对象的属性名称。如果 propertiesObject 参数不是 null 或者一个对象,则会抛错
实现:
//Object.create 底层实现:
Object.create = function(obj){
var Function = function(){};
Function.prototype = obj;
return new Function();
}
var parent = {
name: "parent";
age: 50;
}
//-----child1
var child1 = Object.create(parent);
//child1 是一个新的对象{},但是child1 的原型对象是parent,//输出child1 .name为"parent",//是因为child1 的对象上没有name属性就会在原型对象上面找,child1 .__proto__.name为"parent"
//----child2
var child2 = Object.create(parent, {weight: 300});
// child2 = {weight: 300};
但是原型对象是parent.
注:当第一个参数proto为null时,表示:创建出的对象不会有原型链上的操作,也就是说将null设置成了新创建对象的原型,自然就不会有原型链上的属性。
使用场景:
- 想要创建一个干净的对象。就可以省去用hasOwnProperty判断属性是否为当前对象的属性。
另一个使用create(null)的理由是,在我们使用for..in循环的时候会遍历对象原型链上的属性,使用create(null)就不必再对属性进行检查了,当然,我们也可以直接使用Object.keys[]
二、New
创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。保留了原有构造对象的属性。
new constructor ( [aguments] )
采用构造器调用模式,执行过程:
-
创建一个新对象;
-
将新对象的原型指向构造函数的原型;
-
执行构造函数绑定
this; -
返回该对象
Function.method('new', function(){ //创建一个新对象,它继承自构造函数的原型对象 var newObj= Object.create(this.prototype);
// 调用构造器函数,绑定this到新对象上 var result= this.apply(newObj, arguments);
// 如果它的返回值不是一个对象,就返回该新对象 return (typeof result=== 'object' && result) || newObj; });//通俗的写法 // new Car() var obj = new Object() obj.proto = Car.prototype; // 执行构造函数, 绑定this Car.call(obj) return obj;
注: 它调用了Car对象的构造函数,并通过call将obj的this绑定到了Car对象上。这一步操作将Car对象上的属性,继承到了obj上
例:
var Parent = function(name, age){
this.name = name;
this.age = age;
}
var Child = new Parent("child", "18");
Child._proto_ == Parent.prototype; //true
三、{}:对象字面量创建
var obj = {name:"test", age:18};
obj.__proto__ == Object.prototype //true
四:区别
| 比较 | new | Object.create |
|---|---|---|
| 构造函数 | 保留原构造函数属性 | 丢失原构造函数属性(但是还是可以在原型链上找到其属性) |
| 原型链 | 原构造函数prototype属性 | 原构造函数/(对象)本身 |
| 作用对象 | function |
function和object |