zoukankan      html  css  js  c++  java
  • 使用原型解决构造函数问题

     

    1. 关键点

    • 每一个函数在定义的时候,都会有跟它关联的一个对象被创建出来
    • 每一个由构造函数创建出来的对象,都会默认的和构造函数的神秘对象关联
    • 当使用一个方法进行属性或者方法访问的时候,会先在当前对象内查找该属性和方法
    • 如果当前对象内未找到,就回去跟它关联的神秘对象内进行查找
    function Person(name, age){
        this.name = name;
        this.age = age;
        this.sayHi = function(){
            console.log("Hello!");
        };
    }
    
    
    var p = new Person("张三", 18);
    p.sayHi(); //当前对象内有这个方法,所以不会去神秘对象内进行查找
    var p1 = new Person("李四", 19);
    p1.sayHello(); //当前对象没没有找到这个方法,所以去神秘对象内进行查找
    

    问题来了,如何访问到这个神秘对象呢?

    
    //可以通过 构造函数.prototype 访问这个神秘对象
    console.log(Person.prototype);
    

    当尝试给这个对象新增一个方法之后:

    Person.prototype.sayHello = function(){
        console.log("我是神秘对象中的方法");
    };
    

    使用p,p1都可以访问这个方法:

    p.sayHello();
    p1.sayHello();
    

    总结:

    所有对象共享神秘对象(构造函数.prototype)内的属性和方法。

    2. 解决方案

    既然所有对象共享神秘对象(构造函数.prototype)内的属性和方法。我们只需要将需要共享的东西,也就是重复占用内存的东西,全部都放到 神秘对象(构造函数.prototype)中,那么所有对象就都可以使用,并且内存里面也只有一份了。

    改造构造函数

    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    
    Person.prototype.sayHi = function(){
        console.log("你好");
    };
    
    //测试
    var p = new Person("张三", 18);
    var p1 = new Person("李四", 19);
    
    console.log(p.sayHi == p1.sayHi); //输出true
    

    3.常见的错误

    3.1. 将属性写在神秘对象(构造函数.prototype)内

    function Car(name){
         this.name = name;
    }
    
    function Person() {}
    
    Person.prototype.name = '张三'; //基本类型的属性影响不大
    
    Person.prototype.car = new Car("法拉利"); //引用类型的属性,会被所有的对象共享
    
    var p = new Person();
    

    3.2. 赋值的错误

    
    function Person() {}
    
    Person.prototype.name = '张三';
    
    var p1 = new Person();
    
    var p2 = new Person();
    
    p1.name = '李四';
    
    console.log( p1.name );
    
    console.log( p2.name );
    
    // 如果是访问数据, 当前对象中如果没有该数据就到构造函数的原型属性中去找
    
    // 如果是写数据, 当对象中有该数据的时候, 就是修改值; 如果对象没有该数据, 那么就添加值
    猩猩爱宝贝儿
  • 相关阅读:
    2016第34周三
    2016第34周二
    Spring中资源的加载ResourceLoader
    Spring的资源抽象Resource2实体类
    Spring资源抽象Resource
    SQL Server死锁产生原因及解决办法 .
    sql server中同时执行select和update语句死锁问题
    数据库死锁实例分析及解决方法
    一次查找sqlserver死锁的经历
    js和Jquery获取选中select值和文本
  • 原文地址:https://www.cnblogs.com/chengxuxing/p/7598104.html
Copyright © 2011-2022 走看看