zoukankan      html  css  js  c++  java
  • 继承---原型式继承

    原型式继承

    基于已有的对象创建新对象

    ①obj()浅复制

    对象的属性会共享

    function obj(o){
     function F(){}
     F.prototype=o;
     return new F();
    }
    var person={
    name:"zhangsan",
    age:18,
    friends:['Lisi','wangwu','zhaoliu']
    };
     var thePerson=obj(person);
    thePerson. name='Sunmenghua';
    thePerson.friends.push('liulaogen');
    console.log(thePerson.name); //Sunmenghua
    console.log(thePerson.friends);
    //["Lisi", "wangwu", "zhaoliu", "liulaogen"]
    
     var theOtherPerson=obj(person);
    theOtherPerson. name='Qi Haiyang';
    theOtherPerson.friends.push('Da liu');
    console.log(theOtherPerson.name);
    //Qi Haiyang
    console.log(theOtherPerson.friends);
    // ["Lisi", "wangwu", "zhaoliu", "liulaogen", "Da liu"]
    
    console.log(thePerson.name);
    //Sunmenghua
    console.log(thePerson.friends);
    // ["Lisi", "wangwu", "zhaoliu", "liulaogen", "Da liu"]
    
    console.log(person.name);
    //zhangsan
     

    ②Object.create() 

    相当于obj()函数;

    可接受两个参数:新对象的原型对象和(新对象的专属属性)            {接受几个对象的原理结果相同,只是赋值方式变了}

    A.当只接受一个参数

    同名属性会被覆盖,但是不会改变其他对象的属性,有各自的name;但friends数组都会改变

    这里修改了thePerson.name的值,theOtherPerson.name的值并未改变,并不是因为thePerson和theOtherPerson有独立的name值,而是thePerson.name="Sunmenghua'是给thePerson添加了name值,并非修改了原型上的name值。

    因为我们找对象上的属性时,总是先找实例上对象,没有找到的话再去原型对象上的属性。实例对象和原型对象上如果有同名属性,总是先取实例对象上的值
            var person = {
                name: "zhangsan",
                age: 18,
                friends: ['Lisi', 'wangwu', 'zhaoliu']
            };
            var thePerson = Object.create(person);
            thePerson.name = 'Sunmenghua';
            thePerson.sex = 'female';
            thePerson.friends.push('liulaogen');
            console.log(thePerson.name); //Sunmenghua 
            console.log(thePerson.friends); //["Lisi", "wangwu", "zhaoliu", "liulaogen"] 
            console.log(thePerson.sex); //'female';
    
            var theOtherPerson = Object.create(person);
            theOtherPerson.name = 'Qi Haiyang';
            theOtherPerson.friends.push('Da liu');
            console.log(theOtherPerson.name); //Qi Haiyang
            console.log(thePerson.name); //Sunmenghua
            console.log(theOtherPerson.friends); // ["Lisi", "wangwu", "zhaoliu", "liulaogen", "Da liu"]         
            console.log(thePerson.friends);//["Lisi", "wangwu", "zhaoliu", "liulaogen", "Da liu"]
            console.log(theOtherPerson.sex); //undefined
    
            console.log(person.name); //zhangsan
            console.log(person.sex); //undefine

    B.接受两个参数

            var person = {
                name: "Sun Menghua",
                friends: ['Liu', 'Wu']
            }
            var thePerson = Object.create(person, {
                name: {
                    value: 'Qi Haiyang '
                },
                age: {
                    value: '19 '
                }
            });
            console.log(thePerson.name); //Qi Haiyang
            //Object.create第二个参数的同名属性会覆盖原型对象上的同名属性;
            console.log(thePerson.age); //19
            var theotherPerson = Object.create(person);
            console.log(theotherPerson.name); //Sun Menghua
            console.log(theotherPerson.age); //undefined
    
            console.log(person.name); //Sun Menghua
            console.log(person.age); //undefined
            //Object.create第二个参数的属性是对象自己的属性,和其他对象不共享d

    基于已有的对象创建新对象

  • 相关阅读:
    15_门面模式
    14_责任链模式
    13_观察者模式
    12_状态模式
    11_策略模式
    10_命令模式
    09_适配器模式
    08_装饰者模式
    07_代理模式
    linux邮件服务器postfix配置实例
  • 原文地址:https://www.cnblogs.com/sunmarvell/p/8880863.html
Copyright © 2011-2022 走看看