對象,一種數據類型。對象是屬性(變量)和方法(函數)結合在一塊兒的數據實體函數
對象的出現,就是爲了解決封裝的問題。能夠將許多屬性與方法封裝在一個對象裏,方便調用,也符合人的思考方式。this
var person = new Object(); person.name = "Jonathan"; person.age = 23; person.job = "Developer"; person.sayName = function () { console.log(this.name); };
var person = { name: "Jonathan", age: 23, job: "Developer", sayName: function () { console.log(this.name); } }; console.log(person.name); //Jonathan person.sayName(); //Jonathan
這樣一來,就把屬性和方法封裝進了一個對象中,方便調用。code
若是要建立許多對象,傳統方法存在如下問題對象
因爲JavaScript自己沒有類的概念,所以誕生了構造函數模式來建立對象,該方法利用函數建立對象。因爲函數自己也是對象,所以能夠這麼操做。
構造函數建立對象的方法是:繼承
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ console.log(this.name); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor");
要點:ip
至此,一個Person對象的建立就完成了,它有如下優勢:原型
但用構造函數模式的方法建立對象並非完美的,它存在如下問題,即:
每一個方法(對象內置函數)都要在實例上從新建立一遍
構造函數也能夠用如下方法定義,方便咱們發現問題io
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = new Function(console.log(this.name)); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor"); console.log(person1.sayName == person2sayName); //false
在新建對象person1和person2時,分別新建了兩個不一樣的方法person1.sayName()和person2.sayName()。
但這很沒有必要,只須要公用一個sayName()方法就行了。爲了解決上述問題,誕生了原型模式console