• JS继承 -- 原型式继承


    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
  • 相关阅读:
    Python环境变量的配置
    关于selenium+python的googledirver和iedirver的配置
    jdk1.6环境变量配置
    windows server 2012R2安装激活码
    Git生成SSHKey
    Linux下配置和安装VNCServer远程服务
    Win7 64位硬盘安装Ubuntu 64位的细微配置
    apache tomcat 8.0 显示目录文件
    跨域登录
    jsonp 代码优化
  • 原文地址:https://www.cnblogs.com/PrajnaParamita/p/5773105.html
Copyright © 2020-2023  润新知