文章目录
0.复习:构造函数,实例对象和原型对象的三者关系
*主要是补充一个知识点:实例对象也有constructor属性,指向其构造函数
function Person() {this.name = 'zs';}
Person.prototype.say = function() {console.log("hello");}
var p1 = new Person();
console.log(p1.constructor == Person);//true
1.object.create
定义
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
意思是用一个已经存在的现有对象用来做Object.create()创建出的新对象的原型对象
语法
Object.create(proto[, propertiesObject])
①proto:传递一个现在有的对象,即新对象的原型对象(新创建的对象_proto_属性指向现有属性)。第一个参数proto的值为null,那么创建出来的对象是一个{}(空对象)并且没有原型;
②propertiesObject:可选,给新对象添加新属性以及描述器。如果没有指定即创建一个{},有原型也有继承Object.prototype上的方法。
示例
var _Aobj = {
name: "zs",
say() {
console.log("我叫" + this.name);
}
};
var a = Object.create(_Aobj, {//手动绑定:将_Aobj作为实例对象a的原型对象
"age": {//给新对象添加新属性age
value: 18
}
});
console.log(a); //{age:18;}
console.log(a.__proto__, a.__proto__ == _Aobj); //{name: 'zs', say: ƒ} true
2.object.create和new的区别
- 最明显的区别是两者对__proto__属性的操作不同,Object.create是手动设置的,使用一个现有对象来作为的__proto__(实例对象的原型对象),new创建的实例对象,其__proto__会自动指向其构造函数的原型对象
- new创建的实例对象会继承构造函数的属性和方法,Object.create创建的实例对象不包含属性和方法,要通过第二个参数来给新对象添加新属性
3.如果使用构造函数的原型对象作为Object.create实例的原型对象
function Person() {
this.name = "zs";
}
Person.prototype.age = 18;
Person.prototype.say = function() {
return this.name;
};
var p1 = new Person();
var p2 = Object.create(Person.prototype);
console.log(p1, p2);
console.log(p1.name, p1.age, p1.say());
console.log(p2.age, p2.say); //没有name属性
从定义上看:
new创建了一个实例,这个实例就是用户定义的对象类型
Object.create应该是创建了一个对象,这个对象的类型是Person
从结果上看:
new创建的实例中既有对象Person原本的属性,也包括原型上的属性和方法
Object.create创建的对象的原型为对象Person,但是没有里面的属性,只有**Person的原型**上的属性和方法
4.参考视频
Object.create()方法详解,与new操作符的区别
进度一:07’34"
进度二:11’55"