摘要:這兩個都是用字面量方法創建的普通對象,不是構造函數無法使用構造函數的原型鏈繼承的方法的實現繼承。
1.最近一直再看javascript高級程序設計3,面向對象章節,前面寫了兩篇讀書筆記
(1)構造函數 --創建對象 (2)構造函數的原型鏈繼承 現在又在網上看到阮一峰大大的一篇非構造函數繼承的文章,特意借來學習一下!
非構造函數繼承--阮一峰
一:什么是非構造函數的繼承? 比如:一個對象叫做中國人 一個對象叫做醫生
var Chinese = { nation:"中國" } var doctor = { career:"醫生" }
怎樣才能讓“醫生”去繼承“中國人”,也就是說,我怎樣才能生成一個“中國醫生”的對象?
這里注意。這兩個都是用字面量方法創建的普通對象,不是構造函數無法使用構造函數的原型鏈繼承的方法的實現繼承。
第一種:object方法
json格式發明人提出的一種方法
function object(o){ function F(){}; // 創建一個空構造函數 F.prototype = o; // 原型對象指向父對象 return new F(); }
這個object函數的作用就是將子對象的prototype屬性指向父對象,從而使的父子對象連在一起
(1)使用時先在父對象基礎聲稱子對象
var Doctor = object(Chinese);
(2)然后給自對象賦上自己的屬性
var Doctor.carrer = "醫生";
(3)這樣子對象就繼承了父對象的屬性了
alert(Doctor.nation); // "醫生"
第二種:淺拷貝
除了使用“prototype”鏈以外,還有另一種思路:就是把父對象的屬性,全部拷貝給子對象,也能實現繼承。 下面這個函數,就是在做拷貝:
function extendCoby(p){ var c = {}; for(var i in p){ c[i] = p[i]; } c.uber = p; // 軟大大:uber是一個德語詞,意思是"向上"、"上一層" return c; }
使用的時候,這樣寫 var Doctor = extend(Chinese); Doctor.carrer = "醫生"; alert(Doctor.nation); // 中國
但是這樣的拷貝有一個問題。那就是,如果父對象的屬性等于數組或另一個對象,那么實際上,子對象獲得的只是一個內存地址,而不是真正的拷貝,因此存在父對象被篡改的可能。
請看現在給Chinese添加一個出生地屬性,它的值是一個數組。
Chinese.birthPlace = ["北京","上海","香港"];
通過extendCopy()函數,Docttor繼承了Chinese
var Doctor = extendCopy(Chinese);
然后我們為出生地添加一個城市:
Doctor.birthPlace.push("廈門");
此時,發生了什么事?
alert(Doctor.birthPlace); // 北京,上海,香港,廈門 alert(Chinese.birthPlace); // 北京,上海,香港,廈門
所以,extendCopy()只是拷貝基本數據類型,我們把這種拷貝叫做淺拷貝。
這是早期的jquery實現繼承的方式
第三種 深拷貝
所謂深拷貝,就是能夠真正意義上的數組和對象的拷貝。 它的實現并不難,只要遞歸調用淺拷貝就可以啦
function deepCopy(p,c){ //參數p,c順序萬不可寫反,因為第一次c為空 var c = c || {}; // 第一次執行函數的時候 c為 空對象 for(var i in p){ if(typeof p[i] === "object"){ // 判斷對象p的一個屬性值是否為復雜數據類型object或array // [] 或 {} 判斷 c[i] = (p[i].constructor === Array) ? [] : {}; deepCopy(p[i],c[i]); // 遞歸調用此方法 }else{ c[i] = p[i]; //簡單數據類型直接賦值 } } return c; // 將新對象c返回出來 } var Chinese = { nation:"中國", place:["A","B","C"], say:function(){ alert(this.nation); } } var Doctor = deepCopy(Chinese); // 調用deepCopy創建新對象 Doctor.carrer = "醫生"; Doctor.place.push("X"); console.log(Doctor); console.log(Chinese);
此方法是目前jq實現集成的方法
感悟:個人感覺此方法只適用簡單方法,不適合復雜對象,復雜對象還是得靠構造函數原型鏈的繼承!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/81180.html
摘要:原文鏈接一什么是非構造函數的繼承比如,現在有一個對象,叫做中國人。通過函數,繼承了。中國北京上海香港廈門北京上海香港廈門北京上海香港這時,父對象就不會受到影響了。目前,庫使用的就是這種繼承方法。 原文鏈接 一、什么是非構造函數的繼承? 比如,現在有一個對象,叫做中國人。 var Chinese = { nation: 中國 } 還有一個對象,叫做醫生。 var Doctor = {...
摘要:對象重新認識面向對象面向對象從設計模式上看,對象是計算機抽象現實世界的一種方式。除了字面式聲明方式之外,允許通過構造器創建對象。每個構造器實際上是一個函數對象該函數對象含有一個屬性用于實現基于原型的繼承和共享屬性。 title: JS對象(1)重新認識面向對象 date: 2016-10-05 tags: JavaScript 0x00 面向對象 從設計模式上看,對象是...
摘要:是完全的面向對象語言,它們通過類的形式組織函數和變量,使之不能脫離對象存在。而在基于原型的面向對象方式中,對象則是依靠構造器利用原型構造出來的。 JavaScript 函數式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向對象的語言,或者只是部分具備一些面向對象的特征。本文將回歸面向對象本意,從對語言感悟的角度闡述為什...
摘要:會造成內存浪費的問題構造函數繼承聲明父類聲明子類生成實例組合式繼承組合式繼承是汲取了兩者的優點,既避免了內存浪費,又使得每個實例化的子類互不影響。 寫在前面 既然是淺談,就不會從原理上深度分析,只是幫助我們更好地理解... 面向對象與面向過程 面向對象和面向過程是兩種不同的編程思想,剛開始接觸編程的時候,我們大都是從面向過程起步的,畢竟像我一樣,大家接觸的第一門計算機語言大概率都是C語...
閱讀 2001·2019-08-29 16:27
閱讀 1370·2019-08-29 16:14
閱讀 3372·2019-08-29 14:18
閱讀 3455·2019-08-29 13:56
閱讀 1252·2019-08-29 11:13
閱讀 2118·2019-08-28 18:19
閱讀 3439·2019-08-27 10:57
閱讀 2273·2019-08-26 11:39