`

JavaScript继承的思想实现

阅读更多

JavaScript作为一门语法比较松散的语言,在ES6之前并没有像C++/Java等传统OO语言一样有class关键字,也不能通过privatepublic等关键字来限定权限。本篇就介绍一下JavaScript是如何实现继承的。

 

JavaScript的继承可以分为两类:

  • 查找资源就上:去转盘(www.quzhuanpan.com
  • 基于对象的继承
  • 基于类型的继承

基于对象的继承

基于对象的继承也叫原型继承。我们知道通过JavaScript字面量创建的对象都会连接到Object.prototype,因此我们用Object.prototype来实现继承。本质上是摒弃类,不调用构造函数,而是用Object.create(),直接让新对象继承旧对象的属性。例如:

 

var person = {

    name: "Jack",

    getName: function () { return this.name; }

}

var p1 = Object.create(person);

console.log(p1.getName());    //Jack

 

代码很简单,person有一个属性和一个方法。对象p1通过Object.create()来继承,第一个参数prototype指向personprototype,这样对象p1就继承了person的属性和方法。

 

Object.create()还可以指定第二个参数,即数据属性,将其添加到新对象中。数据属性可设4个描述符value writableenumerableconfigurable 。后3个看名字也能猜出意思,不指定的话默认为false。因为和本篇关系不大,就不跑题了,只看看设置value的情况:

 

var p2 = Object.create(person, {

    name: {

        value: "Zhang"

    }

});

console.log(p2.getName());    //Zhang

 

Object.create()相当于创建了一个全新的对象,你可以给该对象任意新增,重载它的属性和方法:

 

var person = {

    name: "Jack",

    getName: function () { return this.name; },

    getAge: function() { return this.age; } //注意并没有age这个成员变量,依赖子类实现

}

 

var p3 = Object.create(person);

p3.name = 'Rose';

p3.age = 17;

p3.location = '上海';

p3.getLocation = function() { return this.location; }

 

console.log(p3.getName());    //Rose

console.log(p3.getAge());     //17

console.log(p3.getLocation());    //上海

 

person中并没有age这个属性,因此你调用person.getAge();将得到undefined。但在对象p3里新定义了age这个属性,于是就能正确地调用基类的getAge方法。另外子类重载了name的值,且新定义了location属性和getLocation方法。结果如上所示,不赘述。

 

 

基于类型的继承

基于类型的继承是通过构造函数依赖于原型的继承,而非依赖于对象。例如:

 

function Person(name) {

    this.name = name;

    this.getName = function () { return this.name; }; 

}

function Student(name, age) {

    Person.call(this, name);

    this.age = age;

    this.getAge = function () { return this.age; };

}

Student.prototype = new Person();    //需要通过new来访问基类的构造函数

 

var p = new Person('Cathy');

var s = new Student('Bill', 23);

 

console.log(p.getName());    //Cathy

console.log(s.getName());    //Bill

console.log(s.getAge());     //23

 

Student继承自Personname虽然是在基类Person里被定义的,但用new调用Person的构造函数后,this将被绑定到子类Student对象上,因此name最终是定义在子类Student对象上的。结果如上所示,不赘述。

 

保护隐私

之所以定义getNamegetAge等方法就是不想让用户直接访问nameage等属性。可惜上面两种继承均无法保护隐私,均可像p.namep.age这样直接访问属性。如果认为这些属性的隐私非常重要,希望模拟出OO语言中private属性的效果,可以用函数模块化。

 

所谓函数模块化,本质上就是在函数内新建一个对象,新对象的方法里使用参数对象的属性,然后将新对象返回。此时新对象里是没有参数对象的属性的,达到了保护隐私的目的。代码如下:

 

var person = function(spec) {

    var that = {};        //新对象

    that.getName = function () { return spec.name; };  //使用参数的属性

    that.getAge = function() { return spec.age; };  //使用参数的属性

    return that;        //返回新对象

}

 

var p4 = person({name: 'Jane', age: 20});

 

console.log(p4.name);    //undefined

console.log(p4.age);     //undefined

console.log(p4.getName());    //Jane

console.log(p4.getAge());     //20

 

因为函数person返回的是新对象that,而that里并没有nameage属性,因此直接访问会得到undefined。只能通过that暴露出的两个接口来获取nameage

进一步实现多层继承也非常方便,效果如下,不赘述:

 

var student = function(spec) {

    var that = person(spec);        //新对象继承自person

    that.getRole = function() { return 'student'; };  //新对象增加方法

    that.getInfo = function() {

        return spec.name + ' ' + spec.age + ' ' + that.getRole();

    };

    return that;    //返回新对象

};

 

var p5 = student({name:'Andy', age:12});

 

console.log(p5.name);       //undefined

console.log(p5.getName());  //Andy

console.log(p5.getRole());  //student

console.log(p5.getInfo());  //Andy 12 student

 

 

分享到:
评论

相关推荐

    JavaScript学习之三 — JavaScript实现继承的7种方式

    本篇文章将深入探讨JavaScript实现继承的七种常见方式,帮助你更好地理解和运用这一概念。 1. 原型链继承(Prototype Chain Inheritance) 原型链是JavaScript实现继承的基础。每个函数都有一个`prototype`属性,这...

    javascript继承之工具函数二

    `Object.create()`方法就是基于这种思想实现的。 6. **委托继承**:也称为原型委托,使用原型对象之间的委托关系来实现继承,而不是通过原型链。`Proxy`对象在ES6中提供了实现委托继承的可能性。 `source.js`文件...

    javascript 编程思想

    JavaScript 编程思想的核心在于理解和运用数据与代码的相互作用,它是建立在数据驱动和功能实现的基础上的。在JavaScript中,数据和代码的关系类似于物理世界中的物质与能量,两者互相影响,共同塑造了程序的逻辑。 ...

    Javascript继承[参考].pdf

    在深入理解JavaScript继承之前,我们需要掌握几个核心概念:父类(也称作超类)是指被继承的类,子类是通过继承父类得到的类,抽象类通常不用于实例化,而是作为其他类继承的基础,基类是提供给其他类继承的类,派生...

    浅谈Javascript实现继承的方法

    在Javascript中实现继承是面向对象编程的一个核心概念,它允许一个对象能够继承另一个对象的属性和方法。Javascript是一种基于原型的语言,这与基于类的语言如Java和C++有所不同,因此它的继承机制也显得特别独特。...

    JavaScript是如何实现继承的(六种方式)_.docx

    它的核心思想是利用原型对象(`prototype`)来实现属性和方法的继承。每个构造函数都有一个原型对象,该原型对象又有一个指向构造函数的指针,而构造出的实例则包含一个指向原型对象的内部指针。通过这样的结构,...

    JS继承的实现方式

    ### JS继承的实现方式 JavaScript作为一种灵活且功能强大的编程语言,支持多种继承模式。下面将详细介绍几种常见的继承实现方式,并探讨它们的特点与应用场景。 #### 一、原型链继承 **核心思想**: 将父类的实例...

    老生常谈javascript的面向对象思想

    在ES6之后,引入了class和extends关键字,使得继承看起来更像是传统面向对象语言的实现方式,但实际上在JavaScript中仍然是基于原型的继承。 以上知识点详细介绍了JavaScript面向对象编程中的基本特性、对象的定义...

    Javascript继承机制的设计思想分享

    ### Javascript继承机制的设计思想分享 #### 1. Javascript继承机制简介 Javascript是一种动态类型、解释执行的脚本语言,它不遵循传统的面向对象编程语言中的"类"和"实例"概念。在传统的面向对象编程语言中,类是...

    JavaScript mixin实现多继承的方法详解

    JavaScript Mixin 是一种实现多继承的技术,它允许一个对象(或类)继承多个其他对象(或类)的特性。在JavaScript这种仅支持单一原型链继承的语言中,通过Mixin可以模拟多继承的效果。以下是对JavaScript Mixin实现...

    JavaScript程序中实现继承特性的方式总结

    然而,JavaScript 的原型继承体系非常独特,它通过原型对象(prototype)来实现对象之间的继承关系。 在 JavaScript 中,每个对象都有一个原型,原型本身也是对象,且可以拥有自己的原型,这样就形成了原型链...

    JavaScript 继承机制的实现(待续)

    ### JavaScript继承机制详解 #### 一、对象冒充方法实现继承 **原理**: JavaScript中的对象冒充是一种实现继承的方式,其核心思想是利用构造函数内部的`this`关键字指向新创建的对象实例,并通过调用另一个构造...

    JavaScript面向对象实现简单工厂模式

    JavaScript面向对象实现简单工厂模式是一种常见的设计模式,它在软件工程中被广泛应用于创建对象的场景。简单工厂模式的核心思想是将对象的创建过程抽象出来,由一个专门的工厂类负责,使得客户端代码无需关心具体...

    深入理解JavaScript是如何实现继承的

    下面将详细介绍这些继承方式的核心思想和实现方法。 1. 原型链继承 原型链是JavaScript实现继承的主要方式。每一个对象都有一个指向它的原型对象的内部链接。当尝试访问一个对象的属性时,如果在当前对象上找不到...

    Head First Javascript源码

    5. **AJAX**:Asynchronous JavaScript and XML,虽然现在更多地使用JSON而非XML,但其核心思想是通过JavaScript异步地从服务器获取数据并更新页面,实现无刷新的数据交换。 6. **函数式编程**:JavaScript支持函数...

    The Principles of Object Oriented.JavaScript

    - **原型链继承**:JavaScript使用原型链实现继承机制,每个对象都有一个指向其原型对象的链接,当查找一个对象的属性时,如果该对象自身不存在该属性,则会沿着原型链向上查找。 - **构造函数**:虽然JavaScript不...

    javascript关于继承解析

    原型对象也是实现JavaScript继承的关键。在JavaScript中,每个函数都会创建一个原型对象,当使用new操作符创建对象实例时,这些实例的原型都指向这个原型对象。通过修改原型对象,可以为所有由这个构造函数创建的...

    JavaScript 继承详解 第一篇

    JavaScript继承的实现通常是通过一个子构造函数,使其继承父构造函数的原型。这可以通过在子构造函数中使用.prototype属性来实现。例如,假设有父构造函数Parent,我们想要创建一个子构造函数Child来继承Parent的...

Global site tag (gtag.js) - Google Analytics