资讯专栏INFORMATION COLUMN

javascript继承

hzc / 1903人阅读

摘要:提供以及特定的包管理机制。语言宏,你得了解预处理器全局变量,连接器和的区别,多继承等。满足满足不满足所以说基本满足条吧满足条件的继承将上的属性放置到上将上的属性放置到上更好的写法我参考的实现依赖是不是更方便呢

javascript是一门比较难精通的语言,原因是其他语言提供机制,javascript提供方法。
在我看来,语言如java,python比较好学的语言有一个特点:关键字多。java提供extends,implements,以及特定的包管理机制。python特殊的文本结构,大量API等。这些语言可以使初学者快速上手,因为大多数需求的满足都是靠机制。语言提供的关键字,库管理,API。一句话就是大家写的代码都一样,思路一样,代码就一样(或差别不大,因为设计模式的存在,有结构差异,但底层结构也相同)。
另一种语言提供作用域,内存布局,语言本身的默认设置等。这种语言如c,c++,javascript,函数式语言。本身是带有一种编译器或解释器的感觉。就是用户身在其中,需要知道一些编译器开发人员才需要的知识。就以javascript来说吧,要想实现继承,你就得了解解释器在读取一个对象的属性的过程中是怎么寻找的(原型链)。c语言:宏,你得了解预处理器;全局变量,连接器;C++:struct和class的区别,vptr,多继承等。
说这么多,只是想为自己花了半年学javascript的痛苦吐槽一下,并没有比较语言的意思,莫喷!java那种思路一下,代码差别不大的优势在企业级开发中才能体现,so i love java!绝没有瞧不起的意思。

继承是什么

以java为例:

class Parent{

String name; //private field
Parent(String name){
    this.name = name;
}

}

class Child{

int id;  //private field
Child(String name,int id){
    super(name);
    this.id = id;
}

}

继承的重点:

1.Child实例化之前,Parent必须实例化
2.Child对象可以使用Parent对象的方法和属性
3.Child可以添加自己的方法,如果方法名相同,则覆盖Parent的方法
4.Child可以添加自己的静态方法,可以继承Parent的父类方法

简单继承

这也是网上比较多的继承方法(类式继承):

function Parent () {
    this.ParentValue = true;  //private field
}

Parent.staticP = 1;

Parent.prototype.getValue = function () {
    return this.ParentValue;
}

function Child () {
    this.ChildValue = true;  //private field
}

Child.prototype = new Parent();

Child.prototype.getValue = function () {
    return this.ChildValue;
}

Child.staticC = 1;

这种方式不能满足上面的4个条件:
1.满足,但是不是完全相同。Parent在Child定义时就已经实例化了,Parent实例化太超前了,导致所有Child对象同享一个Parent实例,如果一个Child对象改变了Parentvalue,所有Child对象都发生改变。
2.满足
3.满足
4.不满足
所以说基本满足2.5条吧

满足条件的继承
function Parent () {
    this.ParentValue = true;  //private field
}

Parent.staticP = 1;

Parent.prototype.getValue = function () {
    return this.ParentValue;
}

function Child (p,c) {
    Parent.call(this,p);
    this.ChildValue = c;  //private field
}

Child.staticC = 1;
inheritPrototype(Parent,Child);


Child.prototype.getValue = function () {
    return this.ChildValue;
}


function inheritPrototype (Parent,Child) {
    merge(Parent,Child); //将Parent上的属性放置到Parent上
    var p = inheritObject(Parent.prototype);
    p.constructor = Child;
    return p;
}

function inheritObject (o) {
    function F(){}
    F.prototype = o;
    return new F();
}

//将Parent上的属性放置到Parent上
function merge (dist,source) {
    for(attr in source){
        if(source.hasOwnProperty(attr)){
            if(!dist.hasOwnProperty(attr)){
                dist[attr] = source[attr];
            }
        }
    }
}
更好的写法

我参考Backbone的实现
Backbone依赖Underscore

function Parent () {
    this.ParentValue = true;  //private field
}
Parent.staticP = 1;


function Child (p,c) {
    Parent.call(this,p);
    this.ChildValue = c;  //private field
}


function extend(Parent,Child,protoProps,staticProps){
    _.extend(Child, Parent, staticProps);

    Child.prototype = _.create(Parent.prototype, protoProps);
    Child.prototype.constructor = Child;

    return Child;
}

extend(Parent,Child,{
    getValue: function() {
        return this.ParentValue;
    }
}, {    
    staticC: 1
});
是不是更方便呢!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78846.html

相关文章

  • 彻底搞懂JavaScript中的继承

    摘要:这正是我们想要的太棒了毫不意外的,这种继承的方式被称为构造函数继承,在中是一种关键的实现的继承方法,相信你已经很好的掌握了。 你应该知道,JavaScript是一门基于原型链的语言,而我们今天的主题 -- 继承就和原型链这一概念息息相关。甚至可以说,所谓的原型链就是一条继承链。有些困惑了吗?接着看下去吧。 一、构造函数,原型属性与实例对象 要搞清楚如何在JavaScript中实现继承,...

    _ivan 评论0 收藏0
  • 讲清楚之 javascript 对象继承

    摘要:中的继承并不是明确规定的,而是通过模仿实现的。继承中的继承又称模拟类继承。将函数抽离到全局对象中,函数内部直接通过作用域链查找函数。这种范式编程是基于作用域链,与前面讲的继承是基于原型链的本质区别是属性查找方式的不同。 这一节梳理对象的继承。 我们主要使用继承来实现代码的抽象和代码的复用,在应用层实现功能的封装。 javascript 的对象继承方式真的是百花齐放,属性继承、原型继承、...

    Jonathan Shieber 评论0 收藏0
  • javascript继承 --- 多种继承方式解析(ES5)

    摘要:继承前言作为一门轻量级的脚本语言在和的横空出世之后将其推向的新的高度虽然中出现的新的生成对象的类语法格式但依然为的语法糖而我们依然有必要从的原生实现入手来了解它的继承实现方式给出了更加简洁的固定的类声明方式有兴趣的可以查看阮一峰的入门下面给 javascript继承 前言 javascript作为一门轻量级的脚本语言在ES6和node.js的横空出世之后将其推向的新的高度,虽然 ES6...

    yankeys 评论0 收藏0
  • 白话解释 Javascript 原型继承(prototype inheritance)

    摘要:我们有了构造函数之后,第二步开始使用它构造一个函数。来个例子这种方式很简单也很直接,你在构造函数的原型上定义方法,那么用该构造函数实例化出来的对象都可以通过原型继承链访问到定义在构造函数原型上的方法。 来源: 个人博客 白话解释 Javascript 原型继承(prototype inheritance) 什么是继承? 学过面向对象的同学们是否还记得,老师整天挂在嘴边的面向对象三大特...

    kid143 评论0 收藏0
  • javascript继承你了解多少?

    摘要:和构造函数前面提到,是个内置隐藏属性,虽然在可以通过访问,但是其设计本意是不可被读取和修改的,那么我们如何利用原型链来建立继承关系提供了关键字。到这儿,思路就清晰了,怎么让对象和对象的相连实现继承只需把的构造函数的连接到就行了。 什么是继承? 大多数人使用继承不外乎是为了获得这两点好处,代码的抽象和代码的复用。代码的抽象就不用说了,交通工具和汽车这类的例子数不胜数,在传统的OO语言中(...

    baishancloud 评论0 收藏0

发表评论

0条评论

hzc

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<