1. 程式人生 > >JS構造函數、原型對象、隱含參數this

JS構造函數、原型對象、隱含參數this

this tro property 需要 語法 sta 沒有 hello prop

This
解析器再調用函數每次都會向函數內部傳遞一個隱含的參數this,this指向的是一個對象(函數執行的上下文對象)
1、以函數形式調用時,this永遠是window。
2、以方法形式調用時,this就是調用方法的那個對象
3、當以構造函數的形式調用時,this就是新創建的那個對象

使用工廠的方法創建對象
通過該方法可以大批量的創建對象,這樣創建的對象使用的構造函數都是Object,無法區分多種不同類型的對象。

function create(name,age,geder){
 var obj = new Object();
 obj.name = name;
 obj.age = age;
 obj.gender =gender;
 obj.sayName = function(){
 alert(this.name);
 };
 return obj;
}
 var obj1 = create(“xx”,xx,“x”);
 var obj2 = create(“xx”,xx,“x”);
 var obj3 = create(“xx”,xx,“x”);
 console.log(obj1);
 console.log(obj2);
 console.log(obj3);

構造函數
一個普通的函數,創建方式和普通函數沒有區別,不同的是構造函數習慣首字母大寫
構造函數和普通函數的區別就是調用方式不同,普通函數直接調用,構造函數需要用new關鍵字
執行流程:
1、 立刻創建一個新的對象
2、將新建對象設置為this,在構造函數中可以使用this來引用新建的對象
3、逐行執行函數中代碼
4、將新建的對象作為返回值返回

function person(name,age,geder){
 this.name = name;
 this.age = age;
 this.gender =gender;
 this.sayName = function(){
 alert(this.name);
 };

}
 var per = new person(“xx”,xx,“x”);
 var per2 = new person(“xx”,xx,“x”);
 var per2 = new person(“xx”,xx,“x”);
 console.log(per);
 console.log(per2);
 console.log(per3);

使用instanceof可以檢查一個對象是否是一個類的實例
語法:對象 instanceof 構造函數
如果是則返回true,否則返回false
為節省空間,將sayname方法在全局作用域中定以,
?但會汙染全局作用域的命名空間,不安全
原型(prototype)
每創建一個函數,解析器都會向函數中添加一個屬性,這個屬性對應一個對象就是原型對象
?作為普通函數調用prototype沒有任何作用
?以構造函數調用時,創建的對象都會有一個隱含的屬性,
????指向該構造函數的原型對象,可以通過_ _proto_ _來訪問該屬性
?原型對象相當於一個公共的區域,所有對象都可以訪問到原型的屬性可以將對象中共有的內容,統一設置到原型對象中

function MyClass(){
}
//向MyClass的原型中添加屬性a
MyClass.prototype.a = 123;
//向MyClass的原型中添加一個方法
MyClass.prototype.sayHello = function(){
 alert("Hello");
};

檢查對象自身中是否含有某個屬性用對象的hasOwnProperty()

JS構造函數、原型對象、隱含參數this