var obj;for(var i=0; i<10; i++){ obj = {};}再比如下面代碼,永遠不可能相等console.log([] == []); // falseconsole.log({} == {}); // falseconsole.log(function(){} == function(){}); // false對于引用類型,==和===都是比較內存地址那么構造函數function Person(name,age,gender){ this.name = name; this.age = age; this.gender = gender; this.sayHello = function() {};}var p1 = new Person('jim',19, '男');var p2 = new Person('jack',20, '男');在內存中會有兩個sayHello副本,但邏輯一模一樣,浪費資源需要將像方法這些可以共享的數據單獨存儲起來,讓每個對象都可以在方法上得到共享。因此引入一個特殊的對象,以存儲共享數據,然后每個對象都可以直接使用共享的數據。(2)什么是原型?原型只是一個很普通的對象,但它專門給一些對象存儲共享的數據,所以給它取一個名字,叫原型。(3)原型的結構?① 凡是寫一個函數的時候,內部就會自動創建一個對象,該對象使用 函數.PRototype 來訪問;② 該對象只包含一個數據,即 constructor 屬性,用于描述該對象對應的函數;③ 該對象有一個使用特征:如果將函數作為構造函數來使用,創建出來的對象默認連接到該特殊對象中;(所謂連接到特殊對象,是指特殊對象中的成員,可以直接被該構造函數創建出來的對象所使用)這個特殊對象就是原型(原來的/原始的形態/模型)。(4)補充一些概念(依照面向對象語言):
概念詞 | 作用 | 稱為 |
構造函數constructor | 用來描述對象應該具有什么成員使用 | 類 class |
屬性 property | 用于表示對象的特征數據 | 字段 field |
方法 method | 用于描述對象的行為 | 函數 function |
構造函數創建的對象 | 稱為該構造函數(該類)的實例,將這個過程稱為實例化 | 實例instance |
// 給原型添加屬性的例子function Person(){}Person.prototype.type = 'Person';var p = new Person();p.type; // 'Person'(1)直接利用對象的動態特性添加成員構造函數.prototype.XXX = xxx;(2)利用直接替換原型對象的方法構造函數.prototype = { constructor: 構造函數, XXX1: xxx1, XXX2: xxx2, XXX3: xxx3, ...}//原來的原型就被丟棄掉了在利用替換法使用原型的時候,容易出現的問題:實例在被創建的那一刻它的原型就被固定了。
新聞熱點
疑難解答