繼承

1.繼承有什么作用?

使用現(xiàn)有類的所有功能,并在無需重新編寫原來的類的情況下對這些功能進行擴展。

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

(1)工廠模式

function createPerson(name, age){
  var o = new Object();
  o.name = name;
  o.age = age;
  o.sayName = function(){
    console.log('my name is ' + this.name);
  }
  return o;
}
var p1 = createPerson('hunger', 20);
var p2 = createPerson('velly', 30);
p1.sayName();//my name is hunger
p2.sayName();//my name is velly

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

function Person(name, age){
  this.name = name;
  this.age = age;
  this.sayName = function(){
    console.log(this.name);    
  }
}
var p1 = new Person('hunger', 20);
var p2 = new Person('velly', 30);
p1.sayName();//hunger
p2.sayName();//velly

(3)原型模式

function Person(){
}
Person.prototype = {
  construtor: Person;
  name: 'hunger';
  age: 20;
  friends: ['velly', 'jiregu'];
  this.sayName: function(){
    console.log(this.name);
  }
}
var p1 = new Person();
var p2 = new Person();
p1.friends.push('jrg');
console.log(p1.friends);//'velly, jirengu,jrg'
console.log(p2.friends);//'velly,jirengu,jrg'

(4)組合使用構(gòu)造函數(shù)模式和原型模式:

function Person(name, age){
  this.name = name;
  this.age = age; 
}
Person.prototype.sayName = function(){
  console.log(this.name);
}
var p1 = new Person('hunger', 20);
var p2 = new Person('jirengu', 30);
p1.sayName();//hunger
p2.sayName();//jirengu

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

//方法1
function People(name, sex){ 
  this.name = name; 
  this.sex = sex; 
  this.printName = function(){ 
  console.log(this.name); 
  }
}
var p1 = new People('饑人谷', 2)

//方法2
function Person(name, sex){ 
  this.name = name; 
  this.sex = sex;
}
Person.prototype.printName = function(){ 
  console.log(this.name);
}
var p1 = new Person('若愚', 27);

區(qū)別:同樣都是創(chuàng)建printName方法,方法1的printName方法是在函數(shù)Person實例對象里的,方法2是在Person的prototype對象上的。當(dāng)再創(chuàng)建一個Person實例對象的時候,方法1又將會再創(chuàng)建一個printName方法,占用新的內(nèi)存,而方法2將一個公用的printName方法寫在原型上,當(dāng)對象要使用該方法只需到原型鏈里調(diào)用就可以了,達到節(jié)省內(nèi)存的效果。

4.Object.create有什么作用?兼容性如何?如何使用?

  • 作用:創(chuàng)建一個擁有指定原型和若干個指定屬性的對象。
  • 兼容性:


    兼容性
  • 使用:
function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype.sayName = function(){
  console.log(this.name);
}
function Male(name, age, sex){
  Person.call(this, name, age);
  this.sex = sex;
}
Male.prototype = Object.create(Person.prototype);
Male.prototype.saySex = function(){
  console.log(this.sex);
}
var p1 = new Male('hunger', 20, 'nan');
p1.saySex();

5.hasOwnProperty有什么作用? 如何使用?

  • 作用:判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性
  • 語法:obj.hasOwnProperty(prop)(prop為要檢測的屬性名稱)
    -使用:
p1.hasOwnProperty('name');//true
p1.hasOwnProperty('sayName');//false
p1.hasOwnProperty.prototype('saySex');//true

6.實現(xiàn)Object.create的 polyfill,如:(ps: 寫個 函數(shù)create,實現(xiàn) Object.create 的功能)

function create(obj){
  function Temp(){}
  Temp.prototype = obj;
  return new Temp();
}
var obj = {a: 1, b:2};
var obj2 = create(obj);
console.log(obj2.a); //1

7.如下代碼中call的作用是什么?

unction Person(name, sex){ 
  this.name = name; 
  this.sex = sex;
}
function Male(name, sex, age){ 
  Person.call(this, name, sex); 
  //這里的call是獲取構(gòu)造函數(shù)Person的屬性,把Person的環(huán)境改到自己(Male)的作用域內(nèi),從而實現(xiàn)構(gòu)造函數(shù)的繼承。
  this.age = age;
}

8.補全代碼,實現(xiàn)繼承

function Person(name, sex){ 
  this.name = name;
  this.sex= sex;
}
Person.prototype.getName = function(){ 
  return this.name;
}; 
function Male(name, sex, age){ 
  Person.call = (this, name, sex);
  this.age = age;
}
Male.prototype = Object.create(Person.prototype);
Male.prototype.constructor = Male;
Male.prototype.getAge = function(){ 
  return this.age;
};
Male.prototype.printName = function(){
  console.log(this.name);
}
var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,540評論 3 12
  • 1.繼承(接口繼承和實現(xiàn)繼承) 繼承是 OO 語言中的一個最為人津津樂道的概念。許多 OO 語言都支持兩種繼承方式...
    believedream閱讀 1,071評論 0 3
  • 繼承有什么作用? (難度:3*) 繼承可以使一個對象直接使用另一個對象的屬性和方法。 有幾種常見創(chuàng)建對象的方式? ...
    coolheadedY閱讀 616評論 0 0
  • Q&A: 1. 繼承有什么作用? 概念:繼承是指一個對象直接使用另一個對象的屬性和方法。 作用:繼承劃分了類的層次...
    進擊的阿群閱讀 654評論 0 1
  • 面向?qū)ο蟮恼Z言都有一個類的概念,通過類可以創(chuàng)建多個具有相同方法和屬性的對象,ES6之前并沒有類的概念,在ES6中引...
    Erric_Zhang閱讀 1,217評論 1 4

友情鏈接更多精彩內(nèi)容