对象继承

  说到面向对象继承就要扯到原型链了,因为ECMAScript实现继承的主要方法就是原型链,JavaScript高级程序设计一书中这样写到:继承基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。

1、原型链继承

 1 function Person(name,sex){
 2     this.name = name;
 3     this.sex = sex;
 4 }
 5 Person.prototype.play = function(){
 6     console.log("running");
 7 }
 8 function Student(age){
 9     this.age = age;
10 }
11 Student.prototype = new Person("小花","女");

上面代码通过将实例化的Person赋给Student.prototype来实现继承,现在原来存在于Person实例中的所有属性和方法现在也在Student.prototype中了。现在来实例化一个Student对象来访问继承来的name属性,可以打印出来"小花"

var Dave = new Student();
console.log(Dave.name);//小花

2、call、play方法实现继承

之所以把这两种方法写在一块是因为他们区别就在于第二个参数的问题

上面的代码Person类不变,改变一下Student类

function Student(name,age,sex){
    // call,apply方法的第一个参数都是要传入给当前对象的对象,后面的参数都是传递给当前对象的参数
    //Person.call(this,name,sex);
    Person.apply(this,[name,sex]);
    this.age = age;
}
var Dave = new Student("Dave",19,"男");
console.log(Dave.name);//Dave

通过上面代码可以看到call方法第二个参数作为call的参数传入,而apply得第二个参数必须是数组或者arguments(有关于arguments的知识这里不做展开,附上链接可以查看)传入。

现在对Person.call(this,name,sex)进行分析:new Student("Dave",19,"男")之后,Student里面的this关键字指向了Student的实例Dave,而Person.call(this,name,sex)会执行Person方法,并传入name,sex作为参数。Person中的this会被call(this里的this->Student的实例Dave替换掉),所以Person里的this.name=name可以写成Dave.name=name.

若是打印Dave.play()则会报错,说明call和apply方法只能继承构造函数的属性和方法,不能继承构造函数的prototype属性添加的方法

3、组合继承

这种方法就是前面两种继承方法的组合体。

Person类还是保持不变,第二种方法的Student类也保持不变

1 Student.prototype = new Person();
2 //更改Student实例化对象原型的constructor属性的指向
3 Student.prototype.constructor = Student;
4 var Dave = new Student("Dave",19,"男");
5 console.log(Dave.age);//19
6 Dave.play();//running

这种方法将上面两种方法融合在一起,避免了原型链、call和apply方法的缺陷。所以组合继承方法也是JS最常用的对象继承方法。

还有很多继承方法,这里只介绍了最常用的三种有不足之处欢迎指正。。。

参考:https://segmentfault.com/q/1010000005721719/a-1020000005721953

时间: 2025-01-05 18:32:01

对象继承的相关文章

对象继承方式

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>对象继承</title> </head> <body> <script> /* function Person(name, age){ this.name = name; this.age = age; this.say

JS对象继承篇

JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person(){ this.name = "Person"; } Person.prototype.getName = function(){ return this.name; }; function SuperPerson(name,sex){ this.name = name; this.sex

原型继承+原型链 + 对象继承发展

一.原型继承: 1.说起原型继承,就要先由构造函数创造对象说起,首先了解构造函数内部基本原理: (1).在函数体最前面隐式的加上this = {} (2).执行 this.xxx = xxx; (3).隐式的返回this 并且要注意隐士创建的this对象中有个名为__proto__的属性,其属性值为该构造函数继承的原型prototype. 而原型对象的有一个名为constructor的属性,其属性值为继承之的构造函数, 所以可以通过这两个属性相互查看 2.原型的定义及一些特点: a.定义:原型是

Javascript对象----继承

Javascript对象具有"自有属性",也有一些属性是从原型对象继承而来的.为了更好地理解这种继承,必须更深入地了解属性访问的细节. 假设要查询对象o的属性x,如果o中不存在x,那么将会在o的原型对象中查询属性x.如果原型对象中也没有x,但这个原型对象也有原型,那么会继续在这个原型对象的原型上执行查询,直到找到X或者查找到一个原型是null的对象位置.可以看到,对象的原型属性构成了一个"链",通过这个"链"可以实现属性的继承. var o = 

javaScript 工作必知(七) 对象继承

对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属性值未发生改变. alert(c.r);//c中r覆盖了o中的属性.     如何调用o中的r属性呢. var o = { r: 1 }; var c = function f() { }; c.prototype = o; alert(o.r);//1 被继承的属性值未发生改变. alert(c.

Python对象继承set类型

Python对象继承set类型 class Feature(set): def __init__(self): set.__init__(self) # 这里演示将Feature类的加号重载成set.add方法 def __add__(self, feature): set.add(self, feature)

学习Python的对象继承

Python是面向对象的语言,以下我对ConfigParaser.ConfigParaser对象的扩展.添加了 get_client 方法,对自定义参数的分解过程. #coding=utf-8 import ConfigParser import re # 对象继承自对象 ConfigParser.ConfigParser class Config( ConfigParser.ConfigParser ): ''' 提取从服务器列表数据 配置信息实例 [hosts] client = root:

JS中对象继承方式

JS对象继承方式 摘自<JavaScript的对象继承方式,有几种写法>,作者:peakedness 链接:https://my.oschina.net/u/3970421/blog/2872629 方式一:对象冒充 原理:构造函数使用this关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使Parent构造函数称为Children的方法,然后调用它.Children会收到Parent的构造函数中定义的属性和方法. *** //父类构造函数 var P

JavaScript 的对象继承方式,有几种写法?

JavaScript 的对象继承方式,有几种写法? 一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数 成为 Children 的方法,然后调用它.Children 就会收到 Parent 的构造函数中定义的属性和方法.例如,用下面的方式定义 Parent 和 Children: 原理:就是把 Parent 构造函数放到 Children 构造函数里面执行一次.那为什么不直接执行,