资讯专栏INFORMATION COLUMN

C4:继承

Karrdy / 1359人阅读

摘要:如何继承如上,只需简单将函数的指向一个对象,就完成了对这个的对象的继承。这一点和直接使用函数的继承方式很像。中出现了类的语法糖,我们写继承就更简便了。

原型
Each object has a private property which holds a link to another object called its prototype. That prototype object has a prototype of its own, and so on until an object is reached with null as its prototype. By definition, null has no prototype, and acts as the final link in this prototype chain. ---MDN

当我们在一个obj对象上查找是否具有某个属性的时候,这个过程是这样的:
1.现在obj 对象中查找是否有该属性,如果有,查找终止。(也就是说如果obj对象上面和它的原型上又一个同名属性,那么对象上面的属性优先。)
2.如果没有,则查看当前obj是否具有__proto__。这个__proto__就是obj原型的引用。如果obj对象没有原型,那么查找终止。
3.如果obj有原型,就查找obj的原型上是否有这个属性。如果有,查找终止。返回这个属性。
4.如果obj的原型上没有这个属性,则查看obj的原型是否有原型。如果没有,则查找终止。
5.如果obj的原型上上面有它自己的原型,那么继续在obj的原型的原型上继续查找。

几乎每一个js对象都有原型,但是有个例外。

let a = Obeject.crate(null)
let b = {}

当Object.create()传入null的时候, 返回一个真正的空对象a。这个对象不同于b,a对象上什么都没有,但是b对象上还有一个__proto__指向Object.prototype。

__proto__和prototype
function Man(name){
    this.name = name
}
Man.prototype.setName = function(name){
    this.name = name
}
let a = new Man("lee")
console.log(a)

输出如下:

实例化的对象a中 有两个属性一个是name,还有一个就是它的原型__proto__。而这个__proto__是指向a 这个对象的构造函数 (a.__proto__.constructor 就是a这个对象的构造函数,也就是Man这个函数。) 的原型的。并且,修改对象的__proto__是不推荐的做法,对于性能的影响可能有时候我们不能不重视。而在Man的这个函数的prototype上面我们定义了一个setName的属性。
所以按照上面的查找流程,我们在a对象的原型上找到了setName属性。

如何继承
let animal = {
    weight:20,
    setWeight:function(weight){
        this.weight = weight
    }
}

function Cat(name){
    this.name = name
}

cat.prototype = animal

如上,只需简单将函数的prototype指向一个对象,就完成了对这个的对象的继承。现在所有通过new Cat()创建的对象都共享这个animal对象里面的属性。
这一点和直接使用Object.create()函数的继承方式很像。

另外一种继承方式,也是比较受开发者认可,类似于下面这种:

function Animal(weight){
    this.weight = weight
}
Animal.prototype.setWeight = function(weight){
    this.weight = weight
}
function Cat(name,weight){
    Animal.call(this,weight)
    this.name = name
}
//同时,我们别忘了,将Cat的prototype设为Animal的prototype,这样就完成了对Animal的继承。
Cat.prototype = Object.create(Animal.prototype)
Cat.prototype.constructor = Cat

ES6 中出现了类的语法糖,我们写继承就更简便了。

最后附上一张原型链的解析图:

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

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

相关文章

  • 原型链学习面试

    摘要:这是实现继承的最通用的方式,这种方法的缺点实例化子类的时候父级的构造函数执行了次,没有必要执行次。 原型链类 创建对象有几种方法 1、字面量对象var o1 = {name:1}var o11 = new Object({name:11})2、显示构造函数创建var M = function(){this.name =o2}var o2 = new M();3.Object.creat...

    Tony 评论0 收藏0
  • 慕课网_《模式的秘密之适配器模式》学习总结

    摘要:时间年月日星期二说明本文部分内容均来自慕课网。慕课网教学源码学习源码第一章适配器模式的简介简介生活中的适配器翻译软件插座适配器适配器模式定义适配器模式讲将一个类的接口,转换成客户期望的另外一个接口。 时间:2017年08月29日星期二说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s.....

    andong777 评论0 收藏0
  • SAP成都C4C小李探花:浅谈Fiori Design Guidelines

    摘要:李寻欢是风云第一刀书中第一高帅富。设计规范也将详细规定何时何地使用何种控件,并提供详细视觉设计稿,以便开发人员准确理解,避免歧义。而就在不久前,官宣停止对这个版本的维护,因此这个版本已经正式退出历史舞台。 Jerry: 我和周帅认识不久,自去年7月SAP成都研究院Cloud for Customer(以下简称为C4C)开发团队组建至今,根据这段时间和周帅愉快的合作经历,我觉得如果把周帅...

    xuexiangjys 评论0 收藏0
  • SAP成都C4C小李探花:浅谈Fiori Design Guidelines

    摘要:李寻欢是风云第一刀书中第一高帅富。设计规范也将详细规定何时何地使用何种控件,并提供详细视觉设计稿,以便开发人员准确理解,避免歧义。而就在不久前,官宣停止对这个版本的维护,因此这个版本已经正式退出历史舞台。 Jerry: 我和周帅认识不久,自去年7月SAP成都研究院Cloud for Customer(以下简称为C4C)开发团队组建至今,根据这段时间和周帅愉快的合作经历,我觉得如果把周帅...

    Kosmos 评论0 收藏0

发表评论

0条评论

Karrdy

|高级讲师

TA的文章

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