寫出幾種建立對象的方式,並說說他們的區別是什麼?

new Object()

直接經過構造函數建立一個新對象。安全

var obj = new Object()
//等同於 var obj = {}

使用字面量的方式更簡單,其實他倆是同樣的。
優勢是足夠簡單,缺點是每一個對象都是獨立的。函數

工廠模式

function createObj(name,age){
    var obj = {};
    obj.name=name;
    obj.age=age;
    return obj
}
var Anson = createObj('Anson', 18)
console.log(Anson)
//{name: "Anson", age: 18}

優勢是 能夠解決建立多個類似對象的問題,缺點是 沒法識別對象的類型。this

構造函數

function Person(name,age){
    this.name =name;
    this.age=age;
    this.sayName =function (){ alert(this.name) }
}
var person = new Person('小明',13);
console.log(person);
//Person {name: "小明", age: 13, sayName: ƒ}

優勢是 能夠建立特定類型的對象,缺點是 多個實例重複建立方法prototype

(構造函數+原型)組合模式

function Person(name, age){
    this.name = name;
    this.age = age;
    Person.prototype.sayName = function (){ alert(this.name) }
 }
var person = new Person('小白',18)
console.log(person);
//Person {name: "小白", age: 18} __proto__ -> sayName: ƒ ()

優勢 多個實例引用一個原型上的方法 比較經常使用設計

動態原型

function Person(name,age){
    this.name=name
    this.age =age
    if(typeof this.sayName != 'function'){
        Person.prototype.sayName = function(){ alert(this.name) }
  }
}
var person = new Person('小紅',15)
console.log(person);
//Person {name: "小紅", age: 15} 動態建立sayName: ƒ ()

優勢 能夠判斷某個方法是否有效,來決定是否須要初始化原型,if只會在僅在碰到第一個實例調用方法
時會執行,此後全部實例共享此方法,須要注意的一點是,不能從新原型對象。code

寄生構造函數模式

function Person(name,age,job){
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function(){
        console.log(this.name)
    }
    return o;
}
var friend=new Person("her",18,"Front-end Engineer");
friend.sayName();
//her

除了使用new操做符,其餘的和工廠函數同樣,能夠爲對象建立構造函數。對象

穩妥模式

function Person(name, age){
    var o={};
    o.sayName=function(){ alert(name) }
    return o;
}
var person = ('小亮',24);
person.sayName();//’小亮‘

除了使用person.sayName()以外 ,沒有辦法在訪問到name的值,適合在某些安全執行環景下使用。繼承

Object.create()

const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};

const me = Object.create(person);

me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten

me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"

傳入一個原型對象,建立一個新對象,使用現有的對象來提供新建立的對象的__proto__,實現繼承。 ip

參考:《JavaScript高級程序設計第三版》、MDNget

相關文章
相關標籤/搜索