JavaScript继承--原型式继承

一、原型式继承的由来:

克罗克福德介绍了一种实现继承的方法,这种方法并没有使用严格意义上的构造函数,而是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。

其给出的函数如下:

    function Object(o){
//        临时性的构造函数
        function F() {}
        F.prototype = o;
        return new F();
    }

解释:

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

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

二、原型式继承:

例子如下:

    function Object(o){
//        临时性的构造函数
        function F() {}
        F.prototype = o;
        return new F();
    } 

    var person = {
         name:"萝卜头",
         friends:["1","2","3"]
     };

     var anotherPerson = Object(person);
     anotherPerson.name="大萝卜头";
     anotherPerson.friends.push("5");

     var anotherPerson2 = Object(person);
     anotherPerson2.name="萝卜干";
     anotherPerson2.friends.push("7");

     console.log(person.friends);

代码解释:

在该例子中可以作为另一个对象基础的是person对象,传入到Object函数中,然后该函数就会返回一个新对象。 这个新对象就会将person作为原型,所以它的原型中就包含一个基本类型值属性和一个引用类型值属性。person.friends不仅属于person所有也会被anotherPerson和anotherPerson2共享。

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

三、改进:

ES5通过新增的Object.create()方法规范了原型式继承。这个方法接受两个参数:一个用作新对象原型的对象和一个为新对象定义额外属性的对象。

    var person = {
        name:"萝卜头",
        friends:["1","2","3"]
    };

    var anotherPerson = Object.create(person,{
        name:{
            value:"大萝卜头"
        }
    });
    anotherPerson.friends.push("5");

    var anotherPerson2 = Object.create(person,{
        name:{
            value:"萝卜干"
        }
    });
    anotherPerson2.friends.push("7");

    console.log(person.friends);


 在只想让一个对象与另一个对象保持类似的情况下,原型式继承是不错的选择。但是包含引用类型值的属性始终都会共享想应的值,就像使用原型模式一样。

注:资料参考《JavaScript高级程序设计》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值