繼承

一、問答題

1.繼承有什么作用? (難度:***)

繼承機(jī)制使得不同的實(shí)例可以共享構(gòu)造函數(shù)的原型對(duì)象的屬性和方法浴鸿,以提高代碼的復(fù)用性推励;

2.有幾種常見創(chuàng)建對(duì)象的方式? 舉例說明? (難度:****)

(1)工廠模式

function createPerson(name,age,job){
  var o = new Object();
  o.name = name;
  o.age = age;
  o.job = job;
  o.sayName = function(){
      alert(this.name)
  }
  return o
}

var person1 = createPerson('lucy',29,'engineer');
var person2 = createPerson('adam',25,'doctor');

函數(shù)createPerson()能夠根據(jù)接受的參數(shù)來構(gòu)建一個(gè)包含所有必要信息的Person對(duì)象,可以無數(shù)次的調(diào)用這個(gè)函數(shù),而每次它都會(huì)返回一個(gè)包含三個(gè)屬性一個(gè)方法的對(duì)象吴旋。工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問題损肛,但卻沒有解決對(duì)象識(shí)別的問題(即怎樣知道一個(gè)對(duì)象的類型)。

(2)構(gòu)造函數(shù)模式

function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function(){
      alert(this.name)
  }
}
var person1 = new Person('lucy',29,'engineer');
var person2 = new Person('adam',25,'doctor');

Person構(gòu)造函數(shù)與createPerson函數(shù)的不同在于:

  • 沒有顯示的創(chuàng)建對(duì)象
  • 直接將屬性和方法賦給this對(duì)象
  • 沒有return語句

要?jiǎng)?chuàng)建新對(duì)象必須用new荣瑟,它會(huì)干四件事:

  • 創(chuàng)建一個(gè)新對(duì)象治拿,作為this
  • this.proto指向構(gòu)造函數(shù)的prototype
  • 執(zhí)行構(gòu)造函數(shù)的代碼
  • 返回新對(duì)象(沒有return對(duì)象就return this)

構(gòu)造函數(shù)的問題:

  • 每個(gè)方法都要在每個(gè)實(shí)例上重新創(chuàng)建一遍;

(3)原型&構(gòu)造模式

function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
}
Person.prototype.sayName = function(){
     alert(this.name)
}
var person1 = new Person('lucy',29,'engineer');
var person2 = new Person('adam',25,'doctor');

(4)Object.create()法
Object.create()是ES5提出的一個(gè)新的方法笆焰,它可以傳入一個(gè)對(duì)象作為該方法返回的對(duì)象的原型對(duì)象劫谅;

//使用字面量創(chuàng)建一個(gè)對(duì)象作為實(shí)例的原型對(duì)象;
var Person = {
    name: 'Jack',
    age:'18',
    sayName:function(){
      console.log(this.name)
    }
}
var Jack = Object.create(Person)
console.log(Jack.name)//Jack
console.log(Jack.age)//18
Jack.sayName()//Jack

Object.create()的內(nèi)在原理:

Object.create  = function(obj){
    function F(){};
    F.prototype = obj;
    return new F(){};
}

這種創(chuàng)建對(duì)象的方法優(yōu)點(diǎn)是比較簡(jiǎn)單嚷掠,缺點(diǎn)是作為原型對(duì)象的對(duì)象的屬性和方法是公有變量捏检,容易遭受修改,實(shí)例對(duì)象之間也不能共享數(shù)據(jù)不皆;

3.下面兩種寫法有什么區(qū)別? (難度:***)

第一種用的是構(gòu)造函數(shù)的方法創(chuàng)建對(duì)象贯城,第二種是用構(gòu)造函數(shù)和原型結(jié)合的方法構(gòu)造函數(shù);
第一種方法的缺陷是霹娄,資源重復(fù)浪費(fèi)能犯,需要在每一個(gè)對(duì)象實(shí)例都創(chuàng)建一個(gè)printName的方法,每個(gè)printName都占用內(nèi)存犬耻;
第二種方法踩晶,將共有的方法部署在原型中,這樣可以達(dá)到節(jié)省內(nèi)存的效果枕磁;

4. Object.create 有什么作用渡蜻?兼容性如何?如何使用计济? (難度:***)

  • Object.create() 方法創(chuàng)建一個(gè)擁有指定原型和若干個(gè)指定屬性的對(duì)象晴楔。
  • 目前,各大瀏覽器的最新版本(包括IE9)都部署了這個(gè)方法峭咒。如果遇到老式瀏覽器税弃,可以用下面的代碼自行部署:
if(!Object.create){
  Object.create = function(obj){
      function F(){}
      F.prototype = obj;
      return new F();
  }
}
  • 實(shí)例詳見第2題創(chuàng)建對(duì)象方法之Object.create法

5.hasOwnProperty有什么作用? 如何使用凑队? (難度:***)

對(duì)象實(shí)例的hasOwnProperty方法返回一個(gè)布爾值则果,用于判斷某個(gè)屬性定義在對(duì)象自身,還是定義在原型鏈上漩氨。

Date.hasOwnProperty('length')// true
Date.hasOwnProperty('toString')// false

hasOwnProperty
方法是JavaScript之中唯一一個(gè)處理對(duì)象屬性時(shí)西壮,不會(huì)遍歷原型鏈的方法。

6.實(shí)現(xiàn)Object.create的 polyfill叫惊,如:(ps: 寫個(gè) 函數(shù)create款青,實(shí)現(xiàn) Object.create 的功能) (難度:****)

function create(obj){
  function F(){}
  F.prototype = obj;
  return new F();
}
function Person(name,age){
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function(){
  console.log(this.name)
}
function Male(male,name,age){
  Person.call(this,name,age)
  this.male = male;
}
Male.prototype = create(Person.prototype);
var adam = new Male('boy','adam',23);

adam.sayName()//adam

7.如下代碼中call的作用是什么? (難度:****)

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    
//構(gòu)造函數(shù)Person在構(gòu)造函數(shù)Male作用域下執(zhí)行,以實(shí)現(xiàn)構(gòu)造函數(shù)屬性的繼承霍狰,call具有改變作用域的作用
    this.age = age;
}

8. 補(bǔ)全代碼抡草,實(shí)現(xiàn)繼承 (難度:****)

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.getName = function(){
    console.log(this.name);
};    
function Male(name, sex, age){
   Person.call(this,name,sex);
   this.age = age;
}
function inherit(Sup,Sub){
    var _prototype = Object.create(Sup.prototype);
    _prototype.constructor = Sub;
    Sub.prototype = _prototype;
}
inherit(Person,Male);
Male.prototype.getAge = function(){
    console.log(this.age);
};
var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName(); //若愚
ruoyu.getAge();  //27

二饰及、代碼

(1)實(shí)現(xiàn)如下dialog 彈窗功能, 參考效果 (難度:*****)

//功能描述: 
// 1. 可使用 dialog.open() 去打開彈窗
// 2. 當(dāng)點(diǎn)擊確定康震、取消時(shí)可使用用戶自定義事件
// 3. dialog 可拖動(dòng)
// 4. 允許頁面展示多個(gè) dialog

function Dialog(){

}

var tpl = '<ul><li>列表1</li><li>列表2</li><li>列表1</li><li>列表1</li></ul>';

$('#open4').on('click',function(){
  var dialog4 = new Dialog();
  dialog4.open({
    title: '歡迎來到饑人谷',
    message: tpl,
    isShowCloseBtn: true,
    isShowConfirmBtn: true,
    onClose: function(){
      alert('close')
    },
    onConfirm: function(){
      alert('確定');
    }
  });
});

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末燎含,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腿短,更是在濱河造成了極大的恐慌屏箍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橘忱,死亡現(xiàn)場(chǎng)離奇詭異赴魁,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钝诚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門尚粘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敲长,你說我怎么就攤上這事郎嫁。” “怎么了祈噪?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵泽铛,是天一觀的道長。 經(jīng)常有香客問我辑鲤,道長盔腔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任月褥,我火速辦了婚禮弛随,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宁赤。我一直安慰自己舀透,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布决左。 她就那樣靜靜地躺著愕够,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佛猛。 梳的紋絲不亂的頭發(fā)上惑芭,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音继找,去河邊找鬼遂跟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的幻锁。 我是一名探鬼主播凯亮,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼越败!你這毒婦竟也來了触幼?” 一聲冷哼從身側(cè)響起硼瓣,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤究飞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后堂鲤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿傅,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年瘟栖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了葵擎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡半哟,死狀恐怖酬滤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寓涨,我是刑警寧澤盯串,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站戒良,受9級(jí)特大地震影響体捏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜糯崎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一几缭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沃呢,春花似錦年栓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至黄锤,卻和暖如春搪缨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鸵熟。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工副编, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人流强。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓痹届,卻偏偏與公主長得像呻待,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子队腐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對(duì)象屬性創(chuàng)建對(duì)象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,401評(píng)論 3 12
  • 繼承 Javascript中繼承都基于兩種方式:1.通過原型鏈繼承蚕捉,通過修改子類原型的指向,使得子類實(shí)例通過原型鏈...
    LeoCong閱讀 293評(píng)論 0 0
  • 1柴淘、構(gòu)造函數(shù)模式 [url=]file:///C:/Users/i037145/AppData/Local/Tem...
    橫沖直撞666閱讀 843評(píng)論 0 0
  • 1.繼承(接口繼承和實(shí)現(xiàn)繼承) 繼承是 OO 語言中的一個(gè)最為人津津樂道的概念迫淹。許多 OO 語言都支持兩種繼承方式...
    believedream閱讀 939評(píng)論 0 3
  • 來太原的第一天,開了一下午會(huì)为严,碰到了一個(gè)內(nèi)化負(fù)責(zé)交叉銷售的老姐妹敛熬,聊了半天,不知是明知還是假知我來太原第股,哥应民,留下你...
    彗星流星都是星閱讀 289評(píng)論 0 3