美文网首页
Js中构造函数和Prototype属性区别

Js中构造函数和Prototype属性区别

作者: Jesse_001 | 来源:发表于2018-09-19 18:31 被阅读0次

    构造函数模式

    //构造函数模式
    function Dog(name,color) {
        this.name = name;
        this.color = color;
        this.type = "犬科动物";
        this.eat = function() {
            console.log(this.color+"色的小狗"+this.name+"在吃东西。");
        }
    }
    var dog1 = new Dog("贝贝","黑");
    var dog2 = new Dog("兜兜","黄");
    console.log(dog1.type); //犬科动物
    dog2.eat(); //黄色的小狗兜兜在吃东西。
    console.log(dog1.type==dog2.type); //true,值比较,所以相等
    console.log(dog1.eat==dog2.eat); //false,因函数不是同一个引用地址
    

    构造函数生成的每个实例都会重新生成一模一样的内容对象
    优点:语法简单直观,便于调用函数内私有变量
    缺点:多占用内存,降低效率

    Prototype模式

    //Prototype模式
    function Dog_Proto(name,color) {
        this.name = name;
        this.color = color;
    }
    Dog_Proto.prototype.type = "犬科动物";
    Dog_Proto.prototype.eat = function() {
        console.log(this.color+"色的小狗"+this.name+"在吃东西。");
    }
    var dog_p1 = new Dog_Proto("贝贝","黑");
    var dog_p2 = new Dog_Proto("兜兜","黄");
    console.log(dog_p1.type);//犬科动物
    dog_p2.eat();//黄色的小狗兜兜在吃东西。
    console.log(dog_p1.type==dog_p2.type); //true
    console.log(dog_p1.eat==dog_p2.eat); //true,指向同一个内存地址,所以相等
    console.log(dog_p1.__proto__ == dog_p2.__proto__); //true;
    

    Prototype模式下的实例对象会共享同一个原型对象,所有实例的type属性和eat()方法,都是指向通一个内存地址,_proto_ 属性指向同一个Object对象
    优点:实例共享原型对象,节省内存
    缺点:语法复杂,不直观

    相关文章

      网友评论

          本文标题:Js中构造函数和Prototype属性区别

          本文链接:https://www.haomeiwen.com/subject/jpainftx.html