JS继承 -- 原型式继承

本文介绍了如何使用原型式继承创建新对象,并对比了两种实现方式:自定义object()函数与ECMAScript5新增的Object.create()方法。通过示例展示了如何进行浅复制及设置额外属性。

4. 原型式继承

借助原型可基于已有的对象创建新对象。同时还不必因此创建自定义类型。

function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}

在object()函数内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型。最后返回这个临时类型的一个新实例。

从本质上讲,object()对传入其中的对象执行了一次浅复制。

var person = {
    name: "Bob",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var anotherPerson1 = object(person);
anotherPerson1.name = "Linda";
anotherPerson1.friends.push("Barbie");

alert(person.name);        //Bob
alert(person.friends);    //Shelby,Court,Van,Rob,Barbie

原型式继承要求必须有一个对象可以作为另一个对象的基础。如果有这么一个对象,就可以把它传递给object()函数,然后在根据具体需求对得到的对象加以修改。

在上面的例子中,可以作为另一个对象基础的是person对象,把它传入到object()函数中,该函数就会返回一个新对象。

这个新对象将person作为原型,所以它的原型中就包含一个一个基本类型值name和一个引用类型值friends。

实际上,这就相当于又创建了person对象的两个副本。

  ECMAScript5通过新增Object.create()方法规范了原型式继承。这个方法接收两个参数。一个用作基础对象,一个为新对象定义额外属性(可选的)。

var person = {
    name: "Bob",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var anotherPerson1 = Object.create(person);
anotherPerson1.name = "Linda";
anotherPerson1.friends.push("Barbie");

alert(person.name);        //Bob
alert(person.friends);    //Shelby,Court,Van,Rob,Barbie

Object.create()方法的第二个参数 与 Object.defineProperties()方法的第二个参数格式相同:每个属性都是通过自己的描述符定义的。以这种方式指定的任何属性都会覆盖原型对象上的同名属性。

var person = {
    name: "Bob",
    friends: ["Shelby", "Court", "Van"]
};

var anotherPerson = Object.create(person, {
    name: {
        value: "Greg"
    },
    age: {
        value: 18
    }
});

alert(anotherPerson.name);    //Greg
alert(anotherPerson.age);    //18
alert(person.name);        //Bob

 

转载于:https://www.cnblogs.com/PrajnaParamita/p/5773105.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值