1. 程式人生 > >第172天:面向對象基本知識點

第172天:面向對象基本知識點

function 首字母 賦值 return .get 變量 pri 擁有 構造函數

一、構造函數和普通函數的區別

在命名規則上,構造函數一般是首字母大寫普通函數遵照小駝峰式命名法。 在函數調用的時候: function fn() { } 構造函數:1. new fn( ) 2 .構造函數內部會創建一個新的對象,即f的實例 3. 函數內部的this指向 新創建的f的實例 4. 默認的返回值是f的實例 普通函數1. fn( ) 2. 在調用函數的內部不會創建新的對象 3. 函數內部的this
指向調用函數的對象(如果沒有對象調用,默認是window) 4. 返回值由return語句決定 構造函數的返回值: 有一個默認的返回值,新創建的對象(實例); 當手動添加返回值後(return語句): 1. 返回值是基本數據類型-->真正的返回值還是那個新創建的對象(實例) 2. 返回值是復雜數據類型(對象)-->真正的返回值是這個對象

二、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中列舉出來。
 1
Object.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天:面向對象基本知識點