创建对象
基于对象创建新对象
我们已经知道了 JavaScript 是一门基于原型的语言。对象的产生是通过原型对象而来的。在本小节中,我们就一起来看一下在 JavaScript 中如何基于对象来创建新的对象。
ECMAScript 5 中提供了Object.create()
方法,可以用来克隆对象。如下:
const person = {
arms: 2,
legs: 2,
walk() {
console.log('walking');
}
}
const ys = Object.create(person);
console.log(ys.arms); // 2
console.log(ys.legs); // 2
ys.walk(); // walking
console.log(ys.__proto__ === person); // true
这里,我们通过Object.create()
方法从 person 对象中克隆了一个 ys 这个对象。所以 person 对象就是 ys 这个对象的原型对象。
我们在使用Object.create()
方法来克隆对象的时候,还可以传入第 2 个参数,第 2 个参数是一个 JSON 对象,里面可以书写新对象的一些属性设定,示例如下:
const person = {
arms: 2,
legs: 2,
walk() {
console.log('walking');
}
}
const ys = Object.create(person, {
name: {
value: "yingside",
writable: false,
enumerable: true
},
age: {
value: 18,
enumerable: false
}
});
console.log(ys.name); // yingside
console.log(ys.age); // 18
console.log(ys.arms); // 2
console.log(ys.legs); // 2
for (let i in ys) {
console.log(i); // name arms legs walk
}
这里我们在创建 ys 这个对象的时候,传入了一个 JSON,分别对 ys 对象的 value、writeable、enumerable 等属性进行设定。
基于对象创建的新对象,可以继承祖辈对象的属性和方法,这其实就是一个继承的关系,如下:
const person = {
arms: 2,
legs: 2,
walk() {
console.log('walking');
}
}
const ys = Object.create(person, {
name: {
value: "yingside",
writable: false,
enumerable: true
},
age: {
value: 18,
enumerable: false
},
born: {
value: "chengdu"
}
});
const son = Object.create(ys, {
name: {
value: "bb"
},
age: {
value: 0
}
})
console.log(son.name); // bb
console.log(son.age); // 0
console.log(son.born); // chengdu
console.log(son.arms); // 2
console.log(son.legs); // 2
son.walk(); // walking
console.log(ys.isPrototypeOf(son)); // true
console.log(person.isPrototypeOf(son)); // true
isPrototypeOf() 函数,用于判断当前对象是否为另外一个对象的原型,如果是就返回 true,否则就返回 false。
该例中,son 这个对象又是从 ys 这个对象克隆而来,以此形成了一条原型链。无论是 person 对象,还是 ys 对象上面的属性和方法,son 这个对象都能继承到。
Comments