JavaScript-原型式继承

在2006年,有个叫道格拉斯·克罗克福德的人写了一篇文章,题目翻译为中文就是JavaScript中的原型式继承。在此文章里,他介绍了一种实现继承的方法。他的想法是借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。于是,他就写下了如下的函数:

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

实现方法如下:

//在object()函数的内部,先创建了一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例
    var person = {
        name:"Nick",
        friends:["xiaowang","xiaochen"]
    };
    var person1 = object(person);
    person1.name = "Mike";
    person1.friends.push("xiaozhang");

    var person2 = object(person);
    person2.name = "lifei";
    person2.friends.push("xiaoli");
    console.log("person1:" + person1.name);
    console.log("person2:" + person2.name)
    console.log("person1 friends:" + person1.friends);
    console.log("person2 friends:" + person2.friends);
    console.log("all friends:" + person.friends);

运行结果如下:

 

 哇,怎么和原型链继承模式一样,不管你建了多少个实例,这个父类的引用值始终都会被这些个子类所创建的实例共享,所以这种继承方式名为原型式继承,和原型链就差一个字=。=

对咯,在ES5中,新增了Object.create()方法规范化了原型式继承,它有两个参数,第一个参数是用作新对象原型的对象,第二个参数是可选的,是一个为新对象定义额外属性的对象。在传入一个参数的时候,这个方法是和object()方法一样一样的!

在没有必要兴师动众地创建构造函数,而只想让一个对象和另一个对象保持类似地情况下,原型式继承是完全可以胜任的。

posted @ 2019-11-06 14:10  好多坨屎  阅读(209)  评论(0)    收藏  举报