继承

1.继承有什么作用?

使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

2.有几种常见创建对象的方式? 举例说明?

(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)构造函数模式

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)组合使用构造函数模式和原型模式:

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.下面两种写法有什么区别?

//方法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);

区别:同样都是创建printName方法,方法1的printName方法是在函数Person实例对象里的,方法2是在Person的prototype对象上的。当再创建一个Person实例对象的时候,方法1又将会再创建一个printName方法,占用新的内存,而方法2将一个公用的printName方法写在原型上,当对象要使用该方法只需到原型链里调用就可以了,达到节省内存的效果。

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

  • 作用:创建一个拥有指定原型和若干个指定属性的对象。
  • 兼容性:


    兼容性
  • 使用:
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.实现Object.create的 polyfill,如:(ps: 写个 函数create,实现 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是获取构造函数Person的属性,把Person的环境改到自己(Male)的作用域内,从而实现构造函数的继承。
  this.age = age;
}

8.补全代码,实现继承

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 5,313评论 3 12
  • 1.继承(接口继承和实现继承) 继承是 OO 语言中的一个最为人津津乐道的概念。许多 OO 语言都支持两种继承方式...
    believedream阅读 4,556评论 0 3
  • 继承有什么作用? (难度:3*) 继承可以使一个对象直接使用另一个对象的属性和方法。 有几种常见创建对象的方式? ...
    coolheadedY阅读 3,582评论 0 0
  • Q&A: 1. 继承有什么作用? 概念:继承是指一个对象直接使用另一个对象的属性和方法。 作用:继承划分了类的层次...
    进击的阿群阅读 3,728评论 0 1
  • 面向对象的语言都有一个类的概念,通过类可以创建多个具有相同方法和属性的对象,ES6之前并没有类的概念,在ES6中引...
    Erric_Zhang阅读 4,837评论 1 4

友情链接更多精彩内容