08月07, 2022

JS进阶(1)--对象(3)--创建对象

创建对象

基于对象创建新对象

我们已经知道了 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 这个对象都能继承到。

本文链接:http://www.yanhongzhi.com/post/js_ap_3.html

-- EOF --

Comments