javascript 面向对象角度中对prototype的理解


Function在js中被用来声明一个函数。然而在从js面向对象的角度来看,Function又被认为是对一个类的声明。(虽然实际上js里并不存在类的概念)

接下来就从面向对象的角度来看一看javascript。

类的声明以及类的实例的创建:

function 类名(){}用来声明js中的一个类。
var 对象名= new 类名();用来创建类的一个实例。

实例的创建过程:

“JavaScript objects have a set of “own properties,” andthey also inherit a set of properties from their prototype object. ”

 

摘录来自: David Flanagan. “JavaScript: The DefinitiveGuide”。 iBooks.


复制类的非静态成员到实例对象中,并赋予对象访问类的prototype的权限(此时不继承prototype中的任何成员)。
实际上,对象对prototype的继承发生在查找对象中的某个成员的时候,而不是在创建对象的时候。这才使得我们能够有选择的覆盖prototype中已存在的成员。

 

 “The fact that inheritanceoccurs when querying properties but not when setting them is a key feature ofJavaScript because it allows us to selectively override inherited properties”

摘录来自: David Flanagan. “JavaScript: The DefinitiveGuide”。 iBooks.


下面来详细写一对象创建,并从类的prototype中继承(inherits)成员的过程:

创建对象,将非静态成员复制给实例对象。(调用hasownproperty返回true,说明成员复制到实例对象中了)

 

访问实例对象时,先查找对象中的成员,若找不到,再到类的prototype中查找,找到了实例对象才允许从prototype中访问(继承)这个成员。

 

ps:这里用“访问”是为了防止引起误解,原文中采用了inherit,直译应为“继承”,但继承带有获得该成员含义,然而实际上用hasownproperty测试时,返回为false,说明仅仅是能够访问类的prototype中的该成员。

 

原型prototype的作用:


类的一个实例可以直接调用其prototype中的成员,但实例中并不存在prototype的拷贝,所有的调用都直接指向类中的prototype。而类中的其他非静态成员也可以直接被实例调用,但它们在创建对象时会被拷贝到对象中。

在我的理解中,从面向对象的角度来看,prototype的意义就在于此,不需要每一个对象都拷贝一份,直接调用所在类中prototype即可,大大节省了资源。

类的继承:

可以将一个类class1的对象(或者一个无类型对象)obj1,直接赋值给另一个类class2的prototype,这样class2的prototype中就拥有了obj1中的成员和obj1所在类的prototype中的成员。这样,class2创建的实例就可以调用所有obj1可以调用的成员(这些成员存在于class2的prototype中),class2相当于继承了class1。


对象调用其成员的过程:

“Suppose you query theproperty x in the object o. If o does not have an own property with that name,the prototype object of o is queried for the property x. If the prototypeobject does not have an own property by that name, but has a prototype itself,the query is performed on the prototype of the prototype. This continues untilthe property x is found or until an object with a null prototype is searched. ”

摘录来自: David Flanagan. “JavaScript:The Definitive Guide”。 iBooks.


首先到成员所在的对象object中去寻找,若找不到,再到object的prototype(即类中的prototype)中去找,若再找不到且prototype有自身的prototype,则会到prototype的prototype中去找(prototype本身也是对象,也就有自己的prototype)。

 

以上是个人从面向对象角度对javascript中prototype的一些理解,写的优点乱,有异议的地方欢迎各路大神指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值