zoukankan      html  css  js  c++  java
  • 原型

    给实例直接赋值,会依据原型链依次向上查找

    fun per() {}

    per.prototype.name = [1,2]

    var per1 = new  per();

    consoloe.log(per1.name)  //[1,2]

    per1.name.push(3) //per1.name ==per.prototype.name [1,2,3]

    per1.name = 18 //per1.name不等于per.prototype.name

     继承:基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法,实现方式,让一个原型对象等于另一个类型的实例

    注意:通过原型链实现继承的时候,不要使用对象字面量创建原型方法,因为这样会重写原型链

    affunction per(){ this.pro = true;}
    
    per.prototype.getpro = function() {return this.pro;};
    
    function per2(){this.pro2 = false;}
    
    per2.prototype = new per();//继承了per
    per2.prototype.getpro2 = function() {return this.pro2;};
    var per3 = new per2();
    per3.getpro2()false
    per3.getpro()true

     new 操作符,以这种方式调用构造函数实际上经历以下4个步骤

    1创建一个新对象

    2将构造函数的作用域赋给新对象(因此this就指向了这个新对象)

    3执行构造函数中的代码(为这个新对象添加属性)

    4返回新对象

    当为对象实例添加一个属性时,只会阻止我们访问原型中的那个属性,但不会修改那个属性(注意是基本类型),如果要访问原型的属性,通过delete删除实例的属性

    原型对象的问题

    1省略了为构造函数传递初始化参数这一环节,导致所有实例在默认情况下都取得相同的属性值,会有一些 不方便,但不是最大问题

    2最大问题是其共享的本性导致的,对于引用类型值的属性来说,问题比较突出

    function Person() {}
    Person.prototype={
        name:'haha',
        age:29,
        friends:['lily','hanlei'],
        sayName: function(){aalert(this.name);}
    }
    var per1 = new Person();
    var per2 = new Person();
    per1.friends.push('van');
    alert(per1.friends);//lily,hanlei,van
    alert(per2.friends);//lily,hanlei,van
    alert(per1.friends == per2.friends);//true

     解决方法

    组合使用构造函数模式和原型模式,原型中的属性为引用类型的时候不会发生改变

    function Per(name, age, job){
        this.name = name;
        this.age = a ge;
        this.job = job;
        this.friends = ['lily', 'lucy'];
    }
    
    Person.prototype = {
        constructor:Person;
        sayName: function(){
            alert(this.name);
        }
        
    };
    var per1 = new Person('jim', '29', 'enjineer');
    var per2 = new Person('greg', '27', 'doctor');
    per1.friends.push('van');
    alert(per1.friends);//lily,lucy,van
    alert(per2.friends);//lily,lucy
    alert(per1.friends == per2.friends);//false
    alert(per1.sayName == per2.sayName);//true
  • 相关阅读:
    全面分析再动手的习惯:链表的反转问题(递归和非递归方式)
    Gatech OMSCS的申请和学习之奥妙
    java线程安全之并发Queue
    一篇文章看懂Java并发和线程安全
    java并发之如何解决线程安全问题
    Java并发/多线程系列——线程安全篇(1)
    当面试官问线程池时,你应该知道些什么?
    java 线程池 使用实例
    多线程-Executors和Executor,线程池
    从阿里Java开发手册学习线程池的正确创建方法
  • 原文地址:https://www.cnblogs.com/afterwawa/p/8744514.html
Copyright © 2011-2022 走看看