JavaScript的实例化与继承:请停止使用new关键字

JavaScript中的new关键字可以实现实例化和继承的工作,但个人认为使用new关键字并非是最佳的实践,还可以有更友好一些的实现。本文将介绍使用new关键字有什么问题,然后介绍如何对与new相关联的一系列面向对象操作进行封装,以便提供更快捷的、更易让人理解的实现方式。

传统的实例化与继承

假设我们有两个类,Class:function Class() {}和SubClass:function SubClass(){},SubClass需要继承自Class。传统方法一般是按如下步骤来组织和实现的:

Class中被继承的属性和方法必须放在Class的prototype属性中

SubClass中自己的方法和属性也必须放在自己prototype属性中

SubClass的prototype对象的prototype(__proto__)属性必须指向的Class的prototype

这样一来,由于prototype链的特性,SubClass的实例便能追溯到Class的方法,从而实现继承:

new SubClass()      Object.create(Class.prototype)
    |                    |
    V                    V
SubClass.prototype ---> { }
                        { }.__proto__ ---> Class.prototype

举一个具体的例子:下面的代码中,我们做了以下几件事:

定义一个父类叫做Human

定义一个名为Man的子类继承自Human

子类继承父类的一切属性,并调用父类的构造函数,实例化这个子类

// 构造函数/基类
function Human(name) {
    this.name = name;
}

/*
    基类的方法保存在构造函数的prototype属性中
    便于子类的继承
*/
Human.prototype.say = function () {
    console.log("say");
}

/*
    道格拉斯的object方法(等同于object.create方法)
*/
function object(o) {
    var F = function () {};
    F.prototype = o;
    return new F();
}

// 子类构造函数
function Man(name, age) {
    // 调用父类的构造函数
    Human.call(this, name);
    // 自己的属性age
    this.age = age;
}

// 继承父类的方法
Man.prototype = object(Human.prototype);
Man.prototype.constructor = Man;

// 实例化子类
var man = new Man("Lee", 22);
console.log(man);
// 调用父类的say方法:
man.say();

DEMO

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/script/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索类的实例化
, class
, 方法
, function
, prototype
, 属性
, 子类
new关键字
,以便于您获取更多的相关知识。

时间: 2024-11-02 12:26:07

JavaScript的实例化与继承:请停止使用new关键字的相关文章

JavaScript是如何实现继承的

 这篇文章主要介绍了JavaScript是如何实现继承的,有需要的朋友可以参考一下 最近最网上看了一个人面试淘宝时的经历,然后发现了自己有好多好多不太清楚的地方,所以特此写点文章来加深自己对一些问题的理解.   文章中提到了一个问题是:JavaScript是如何实现继承的?   下面我便阐述一些在网上找到的方法和实例来解释下,借以加深自己的印象.   我们知道JavaScript中的function是万能的,除了用于的函数定义,也可以用于类的定义.   JavaScript的继承,说起来也是有点

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

最近最网上看了一个人面试淘宝时的经历,然后发现了自己有好多好多不太清楚的地方,所以特此写点文章来加深自己对一些问题的理解. 文章中提到了一个问题是:JavaScript是如何实现继承的? 下面我便阐述一些在网上找到的方法和实例来解释下,借以加深自己的印象. 我们知道JavaScript中的function是万能的,除了用于的函数定义,也可以用于类的定义. JavaScript的继承,说起来也是有点怪,不像C++和一些面向对象的语言,他没有public,private等访问控制修饰,也没有impl

Javascript非构造函数的继承

  Javascript非构造函数的继承         本文给大家介绍的是不使用构造函数实现"继承",非常的简单,小伙伴们仔细了解下就可以非常熟悉了. 一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". 代码如下: var Chinese = { nation:'中国' }; 还有一个对象,叫做"医生". 代码如下: var Doctor ={ career:'医生' } 请问怎样才能让"医生

JavaScript中的对象继承关系_javascript技巧

我们今天就来看一下继承中的类继承以及类继承和原型继承的混用,所谓类继承,就是使用call或者apply方法来进行冒充继承: function Desk(size,height){ this.size=size; this.height=height; } function MJDesk(size,height){ Desk.call(this,size,height);//这种就叫类继承. } var mj = new MJDesk(10,123); 像上面这种就是我们要使用的类继承,用这种继承

关于JavaScript的面向对象和继承有利新手学习_javascript技巧

这是一篇关于JavaScript的面向对象和继承的文章,写于1年前,作者循序渐进,对想学习JavaScript中面向对象的同学来说是很有帮助的,因此试着翻译一下,不妥之处,请指正.原文链接Objects and Inheritance in Javascript 虽然一些Javascript用户可能永远也不需要知道原型或面向对象语言的性质,但是那些来自传统面向对象的语言的开发者使用的时候会发现JavaScript的继承模型非常的奇怪.而不同的JS框架提供了各自的方法来编写类面向对象(class-

JavaScript的9种继承实现方式归纳

  这篇文章主要介绍了JavaScript的9种继承实现方式归纳,本文讲解了原型链继承.原型继承(非原型链).临时构造器继承.属性拷贝.对象间继承等继承方式,需要的朋友可以参考下 不同于基于类的编程语言,如 C++ 和 Java,JavaScript 中的继承方式是基于原型的.同时由于 JavaScript 是一门非常灵活的语言,其实现继承的方式也非常多. 首要的基本概念是关于构造函数和原型链的,父对象的构造函数称为Parent,子对象的构造函数称为Child,对应的父对象和子对象分别为pare

使用apply方法实现javascript中的对象继承

javascript中的对象继承的方法有很多,在接下来的文章中为大家介绍下使用apply方法是如何实现的 代码如下: <script type="text/javascript">  //使用apply方法实现对象继承    function Parent(username) {  this.username = username;  this.sayHello = function() {  alert(this.username);  }  }    function

JavaScript的9种继承实现方式归纳_javascript技巧

不同于基于类的编程语言,如 C++ 和 Java,JavaScript 中的继承方式是基于原型的.同时由于 JavaScript 是一门非常灵活的语言,其实现继承的方式也非常多. 首要的基本概念是关于构造函数和原型链的,父对象的构造函数称为Parent,子对象的构造函数称为Child,对应的父对象和子对象分别为parent和child. 对象中有一个隐藏属性[[prototype]](注意不是prototype),在 Chrome 中是__proto__,而在某些环境下则不可访问,它指向的是这个

javascript创建对象、对象继承的实用方式详解_基础知识

本文约定:不特殊声明的情况下,属性代指属性或方法. 创建对象.对象继承实际上是一回事:我们所需要的实例对象通过构造函数获得私有属性.通过原型链获得共享的属性.什么是好的方式?私有属性通过构造函数的方式获得(不考虑实例中自定义私有属性)且不需要重写,共享属性通过原型链找到且不需要重复创建. 普适的方式 组合使用构造函数模式和原型模式创建对象 function HNU_student(name) { this.name = name; this.sayName = function() { retu