第172天:面向對象基本知識點
阿新 • • 發佈:2018-02-11
function 首字母 賦值 return .get 變量 pri 擁有 構造函數 指向調用函數的對象(如果沒有對象調用,默認是window)
4. 返回值由return語句決定
構造函數的返回值:
有一個默認的返回值,新創建的對象(實例);
當手動添加返回值後(return語句):
1. 返回值是基本數據類型-->真正的返回值還是那個新創建的對象(實例)
2. 返回值是復雜數據類型(對象)-->真正的返回值是這個對象
一、構造函數和普通函數的區別
在命名規則上,構造函數一般是首字母大寫,普通函數遵照小駝峰式命名法。 在函數調用的時候: function fn() { } 構造函數:1. new fn( ) 2 .構造函數內部會創建一個新的對象,即f的實例 3. 函數內部的this指向 新創建的f的實例 4. 默認的返回值是f的實例 普通函數:1. fn( ) 2. 在調用函數的內部不會創建新的對象 3. 函數內部的this二、Get/Set訪問器
語法:
Object.defineProperty(obj, prop, descriptor)
參數:
obj:目標對象
prop:需要定義的屬性或方法的名字。
descriptor:目標屬性所擁有的特性。
可供定義的特性列表:
- value:屬性的值
- writable:如果為false,屬性的值就不能被重寫。
- get: 一旦目標屬性被訪問就會調回此方法,並將此方法的運算結果返回用戶。
- set:一旦目標屬性被賦值,就會調回此方法。
- configurable:如果為false,則任何嘗試刪除目標屬性或修改屬性以下特性(writable, configurable, enumerable)的行為將被無效化。
- enumerable:是否能在for...in循環中遍歷出來或在Object.keys中列舉出來。
1Object.defineProperty(this, "price", { 2 get: function () {return price*0.9;}, 3 set: function (value) { 4 /*大概普通產品的價格都在0--1萬*/ 5 if(value>10000) 6 { 7 alert(‘產品價格必須在0--1萬之間‘); 8 }else{ 9 price = value; 10 } 11 } 12 });
1 function Person() { 2 var age = new Date().getFullYear() - 18; 3 Object.defineProperty(this, "age", { 4 get: function () { alert("內部存儲數據為:" + age); return new Date().getFullYear() - age; }, 5 set: function (value) { age = value; } 6 }); 7 }
使用一下代碼進行測試:
1 var p = new Person(); 2 p.age = 1994; 3 alert("外部獲取到的數據為:" + p.age);
三、函數聲明和函數表達式的區別
函數聲明是可以提升的,而函數表達式不可以提升。
當我們定義一個函數表達式,在這個表達式前面是訪問不到的。
1 //函數聲明,變量fn以及其實現被提升到頂部 2 function fn(){ 3 console.log(‘函數‘) 4 } 5 //函數表達式,僅變量fn2被提升到頂部,實現沒有被提升 6 var fn2 = function(){ 7 console.log(‘函數變量形式‘) 8 }
四、設置某個屬性是否可寫
1 /*我們的需求:自動計算打折後的價格*/ 2 Object.defineProperty(this, "price", { 3 value:5000000, 4 writable: false, 5 });
第172天:面向對象基本知識點