1. 程式人生 > >JS物件宣告的幾種方式

JS物件宣告的幾種方式

-- 新手向知識,就不用ES6寫法了。

一、字面量宣告

var obj = {
        屬性名1 : 屬性值,
        屬性名2 : 屬性值,
        屬性名3 : 屬性值,
        方法名1 : function() {
            .....
        },
        方法名2 : function() {
            .....
        }
    }

通過obj.屬性名obj.方法名()就可以讀取或呼叫物件的屬性/方法了。

二、用new操作符構造Object物件

var obj = new Object();
obj.屬性名1 = 屬性值1;
obj.屬性名2 = 屬性值2;
obj.屬性名3 = 屬性值3;
obj.屬性名4 = 屬性值4;
obj.方法名1 = function() {
    ....
};
obj.方法名2 = function() {
    ....
};
....

首先用new Object()建立一個空物件,然後用多條語句給物件新增屬性/方法。

三、用函式宣告的方式構造物件函式Function本身就是物件Object的例項

var fn = new Function(); //new一個空函式
function myFn() {}; //宣告一個空函式
console.log(fn instanceof Object); //true
console.log(myFn instanceof Object); //true

所以可以模仿new Objcet()構造物件的方式,用function myFn() {}宣告一個自定義的函式,然後通過new myFn()構造物件,比如:

function person(name, age) {
        this.name = name;
        this.age = age;
        this.say = function() {
            console.log('My name is '+ this.name + ', I\'m ' + this.age + ' years old');
        }
    }
    var xiaoMing = new person('xiaoming', 16);
    xiaoMing.say(); //"My name is xiaoming, I'm 16 years old"

通過這種方式宣告的物件,每一次new出來的物件都是獨立的,互相不會有影響,屬性、方法中的this指向的就是新建立的、呼叫他們的物件。

四、工廠模式宣告物件工廠模式宣告物件可以理解成二、三兩種方法的結合體,用三的思想套進二的內容。仿照上面例子舉例:

function person(name, age) {
        var obj = new Object(); 
        obj.name = name;
        obj.age = age;
        obj.say = function() {
            console.log('My name is '+ obj.name + ', I\'m ' + obj.age + ' years old');
        };
        return obj;
    }
    var xiaoMing = person('xiaoming', 16);
    xiaoMing.say(); //"My name is xiaoming, I'm 16 years old"
    var xiaoHong = person('xiaohong', 18);
    xiaoHong.say(); //"My name is xiaohong, I'm 18 years old"

工廠模式之所以叫工廠模式,就是類似於現實生活中的工廠可以產生大量相似的商品,去做同樣的事情,實現同樣的效果。他的寫法與三、用函式宣告的方式構造物件比較像,但是稍有不同。

每一次呼叫function 宣告的函式時,它在內部new Object(),最後將這個新建的物件return回來,呼叫時就像普通函式呼叫一樣,例項化的時候不用再new了(內部new過)。雖然多次呼叫該函式走的都是一樣的流程,但是生產出來的兩個產品互不影響。

五、原型方式宣告物件

function person() {/*空*/};
    person.prototype.height = "1.80m";
    person.prototype.grade = "Senior 3";
    person.prototype.say = function() {
        console.log( 'I\'m ' + this.height + ' tall and I\'m in '+ this.grade);
    }
    var xiaoMing = new person();
    xiaoMing.say(); //"I'm 1.80m tall and I'm in Senior 3"

原型方式是將該物件的屬性/方法寫在他的prototype屬性所指的物件上。(每一個函式或者說物件都有一個prototype屬性,這個屬性以物件的形式存在)。

每次new實際上有這麼一些操作:

1)建立一個空物件2)把這個空物件的__proto__指向建構函式的prototype3)把這個空物件賦值給this4)執行建構函式內的程式碼

new出來的新物件的__proto__屬性都會指向person.prototype,然後就可以執行person.prototype上的函式內容了。

這有點像JS上常說的事件代理/委託。事件不直接繫結在該DOM元素上,而是繫結在它的父級元素,當給該DOM元素新增兄弟元素時,兄弟元素因為冒泡,能觸發相同的事件。

六、混合模式混合模式可以理解成原型模式+建構函式,舉例:

function person(name, height) {
        this.name = name;
        this.height = height;
    };
    person.prototype.age = 18;
    person.prototype.grade = "Senior 3";
    person.prototype.say = function() {
        console.log('Hello, my name is ' + this.name + '. I\'m ' + this.age + ' years old, ' + this.height + ' tall and I\'m in '+ this.grade + '.');
    }
    var xiaoMing = new person('Xiaoming', '1.80m');
    xiaoMing.say();
    //"Hello, my name is Xiaoming. I'm 18 years old, 1.80m tall and I'm in Senior 3."
    var xiaoHong = new person('Xiaohong', '1.65m')
    xiaoHong.say();
    //"Hello, my name is Xiaohong. I'm 18 years old, 1.65m tall and I'm in Senior 3."
    

對比混合模式和原型模式可以發現,混合模式函式體不是空的,而函式體內的內容就是前邊說的構造方式。

這種方式在實際開發中更加常用。