zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    和至少为 K 的最短子数组
    使用VS code编写C++无法实时检测代码的解决办法
    anaconda安装VSCODE后,python报错
    神经网络中sigmod函数和tanh函数的区别
    获取本机IP
    windows C++捕获CMD命令输出
    windows下面生成 dump
    windows 控制台命令输出 捕获
    不使用PEM 文件建立SSL通道
    OpenSSL socket 服务端
  • 原文地址:https://www.cnblogs.com/PrajnaParamita/p/5773105.html
Copyright © 2011-2022 走看看