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的一些理解,写的优点乱,有异议的地方欢迎各路大神指出。