创建对象的方法

二次信任 提交于 2020-02-21 06:43:32

创建对象有多种不同的方法:

1. Object构造函数(无法做到 代码复用)

    var obj1 = new Object();
    obj1.name =  ‘xiaocuo’;
    obj1.age = 25;
    obj1.sayHi = function (){
        alert(‘hi,大家好!我叫’ + obj1.name);
    }

2. 对象字面量(无法做到 代码复用)

  var obj3 = {
        name: ‘laozhao’,
        age: 23,
        sayHi: function (){
            alert(‘hi,大家好!我叫’ + obj3.name);
        }
    }

3. 工厂模式(解决了代码复用的问题,但是无法解决方法共享,对象类型识别的问题)

function createObj( n, a ){
        // 原料
        var obj = {};
        
        // 加工
        obj.name = n;
        obj.age = a;
        obj.sayHi = function (){
            alert(‘hi,大家好!我叫’ + obj.name);
        }

        // 出厂
        return obj;
    }
    var obj1 = createObj(‘小王’, 23);
    var obj2 = createObj(‘小李’, 24);
    
    console.log( obj1.sayHi === obj2.sayHi ); // false
    console.log( obj1.constructor ); // Object

4. 构造函数(解决了对象类型识别的问题,但是没有解决方法共享)

    function Human( n, a ){ // 构造函数
        // var this = {};
        this.name = n;
        this.age = a;
        this.sayHi = function (){
            alert(‘hi,大家好!我叫’ + this.name);
        }
        // return this;
    }
    var obj1 = new Human(‘张三’, 18);
    var obj2 = new Human(‘李四’, 19);
    
    console.log( obj1.sayHi === obj2.sayHi ); // false
    console.log( obj1.constructor ); // Human

5. 原型模式 (解决了方法共享等问题,但是所有实例对象的属性和方法都一样,没有私有属性和方法)

prototype的作用是:所有添加到prototype中的属性和方法都将被所有对象实例共享。(继承)

function Cat(){ };    
Cat.prototype.name =‘小白’;    
Cat.prototype.color =‘white’;    
Cat.prototype.food =‘fish’;    
Cat.prototype.skill = function (){        
    alert(‘卖萌~喵喵喵~~~);    
};
var cat1 = new Cat();//实例
var cat2 = new Cat();//实例
alert(cat1.skill === cat2.skill);//true    
alert(cat1.name === cat2.name);//true

6. 混合模式 (完胜!结合了构造函数模式和原型模式的优点)

构造函数模式用于定义实例属性,原型模式用于定义共享的属性和方法
即可以共享方法,又可以向构造函数传递参数,集两种模式之长!

function Person(n,s,a){
    this.name = n;
    this.sex = s;
    this.age = a;
}
Person.prototype.attr = '人类';
Person.prototype.eat = function (){
    alert('什么都吃');
}
var p1 = new Person('老王','男',36);
var p2 = new Person('小宋','女',26);
console.log(p1.constructor);//Person
console.log(p1.eat === p2.eat);//true

喜欢可以点个赞哦,笔芯 ~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!