一、構造函數
創建一個構造函數,專門用來創建Person對象的
構造函數就是一個普通的函數,創建方式和普通函數沒有區別,不同的是構造函數習慣上首字母大寫。
構造函數與普通函數的區別
構造函數和普通函數的區別就是調用的方式不同
普通函數就是直接調用,而構造函數需要使用new關鍵字來調用
構造函數的執行流程
1.立刻創建一個新的對象
2.將新建的對象設置爲函數中的this,在構造函數中可以使用this來引用新建的對象
3.逐行執行函數中的代碼
4.將新的對象作爲返回值返回
實例:
創建一個Person構造函數
在Person構造函數中,爲每一個對象都添加了一個sayName方法,目前我們的方法是在構造函數內部創建的,也就是構造函數每執行一次就會創建一個新的sayName方法,也是所有實例的sayName都是唯一的;這樣就導致了構造函數執行一次就會創建一個新方法。
執行1000次就會創建1000個新方法,而1000個方法都是一模一樣的,這是完全沒有必要,完全可以使所有的對象共享同一個方法。
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
//向對象中添加一個方法
//this.sayName = fun;
}
//向原型中添加sayName方法
Person.prototype.sayName=function(){
alert("hello,我是"+this.name);
}
//創建一個Person的實例
var per = new Person("孫悟空",18,"男");
per.sayName();
注意:將sayName方法在全局作用域中定義,污染了全局作用域的命名空間,而且定義在全局作用域中也很不安全。所以我們選擇在原型中添加sayName方法
使用同一個構造函數創建對象,我們成爲一類對象,也將一個構造函數稱爲一個類。
我們將通過一個構造函數創建的對象,稱爲是該類的實例
instanceof
使用instanceof可以檢查一個對象是否是一個類的實例
語法:對象instanceof 構造函數
如果是,則返回true;否則返回false
console.log(per instanceof Person);
所有的對象都是Object的後代,所以任何對象和object左instanceof檢查時都會返回true
console.log(dog instanceof Object);
二、原型對象
原型prototype
我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype,這個屬性對應着一個對象,這個對象就是我們所謂的原型對象。
當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性,指向該構造函數的原型對象,我們可以通過__proto__來訪問該屬性。
function Myclass(){
}
//向Myclass的原型中添加屬性a
Myclass.prototype.a = 123;
//向Myclass的原型中添加一個方法
Myclass.prototype.sayHello = function(){
alert("hello");
}
var mc = new Myclass();
//console.log(mc.__proto__);
console.log(mc.a);
mc.sayHello();
原型對象就相當於一個公共的區域,所有同一類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內容,統一設置到原型對象中。
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,如果沒有則會去原型對象中去尋找,如果找到則直接使用。
以後我們創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型對象中,這樣不用分別爲每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了。
hasOwnProperty( )
可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性
使用該方法只有當對象自身中含有屬性時,纔會返回true
console.log(mc.hasOwnProperty("age"));
原型對象也是對象,所以它也有原型
當我們使用一個對象的屬性或方法時,會先在自身中尋找,自身中如果有,則直接使用;如果沒有,則去原型對象中尋找,如果原型對象中有,則使用;如果沒有,則取原型的原型中尋找;直到找到Object對象原型。
Object對象的原型沒有原型,如果在Object中依然沒有找到,則返回undefined。
console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
三、this
this的定義
解析器在調用函數每次都會向函數內部傳遞進一個隱含參數,這個隱含的參數就是this。
this指向的是一個對象,這個對象我們稱爲函數執行的上下文對象
this的情況
根據函數的調用方式的不同,this會指向不同的對象:
1.當以函數的形式調用時,this是window
2.當以方法調用時,誰調用方法this就是誰;
3.當以構造函數的形式調用時,this就是新創建的那個對象