在es6之前,對象不是基於類創建的,而是用一種稱為構造函數的特殊函數來定義對象和它們的特征。
當需要很多很多對象時,而這些對象又有相同的屬性和方法。這時需要把它抽離出來,再大量的生成對象,這時候就需要構造函數。
創建對象可以通過以下三種方式:
1.對象字面量
var obj1 = {}
2.new Object()
var obj1 = new Object()
3.自定義構造函數
function Student(name, age) {
this.name = name
this.age = age
this.study = function() {
console.log(this.name + '在學習')
}
}
var zs = new Student('張三', 18)
console.log(zs) // Student {name: "張三", age: 18, study: ƒ}
zs.study() // 張三在學習
var ls = new Student('李四', 19)
console.log(ls) // Student {name: "李四", age: 19, study: ƒ}
ls.study() // 李四在學習
// 實例成員就是構造函數內部通過this添加的成員 name age study就是實例成員
// 實例成員只能通過實例化的對象來訪問
console.log(zs.name) // 張三
console.log(Student.name) // undefined 或 Student
每當需要一個新的對象,就new一個新的對象。
構造函數是一個特殊的函數,主要用來初始化對象,即為成員變量賦初始值,它總與new一起使用。我們可以把對象中的一些公共的屬性和方法抽取出來,然后封裝到這個函數里。
new 在執行時會做四件事情:
1.在內存中創建一個新的空對象。
2.讓this指向這個對象。
3.執行構造函數中的代碼,給這個對象添加屬性和方法。
4.返回這個新對象(所以構造函數不需要return)。
構造函數存在的問題:浪費內存
當有多個對象實例化時,構造函數里的方法會開辟多個新的內存空間,既浪費時間又浪費內存

解決方法:構造函數原型對象 :prototype
構造函數通過原型分配的函數是所有對象所共享的。
原型是什么?原型是一個對象,我們也稱為prototype為原型對象。
原型的作用是什么?共享方法
每一個構造函數都有一個prototype屬性,指向另一個對象,這個prototype就是一個對象,這個對象的所有的屬性和方法都會被構造函數所擁有。
我們可以把那些不變的方法,直接定義在prototype對象上,這樣所有的對象的實例都可以使用這些方法。
用法:Student.prototype.study = function() {
console.log("在學習")
}
console.log(zs.study === ls.study) // true
這些i對象實例化都指向同一個地址,實現方法的共享。
那么關於構造函數的this指向是怎樣的呢?
前面已經說過了
構造函數的this指向的是對象實例本身,那么構造函數的原型對象的this指向的又是誰呢?
function Student(name, age) {
this.name = name
this.age = age
}
var that
Student.prototype.study = function() {
console.log('在學習')
that = this
}
var zs = new Student('張三', 18)
zs.study()
console.log(that === zs)輸出的是true,那么證明構造函數的原型對象指向的也是zs對象
