原文地址:http://www.excelib.com/article/247/show
相互独立
function的三种子类型是相互独立的,他们只能在自己所对应的环境中来使用而不可以相互调用,这一点大家一定要记住,我们来看个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function log(msg){ console.log(msg); } function Bird(){ var name = "kitty" ; this .type = "pigeon" ; this .getName = function () { return this .name; } } Bird.color= "white" ; Bird.getType = function () { return this .type; } Bird.prototype.getColor = function () { return this .color; } var bird = new Bird(); log(bird.getColor()); // undefined log(bird.getName()); // undefined log(Bird.getType()); // undefined |
这个例子中的最后三条语句都会打印出undefined,下面学生来给大家分析其中的原因。
Bird作为对象时会包含color和getType两个属性,作为处理业务的函数时包含一个name的局部变量,创建出来的实例对象bird具有type和getName两个属性,而且还可以调用Bird.prototype中的getColor属性,getColor也可以看做bird的属性,如下表所示
表4-2
用法 |
子类型 |
对象 |
color、getType |
处理业务 |
name |
创建对象 |
type、getName、(getColor) |
每种用法中所定义的方法只能调用相应用法所对应的属性,而不能相互调用,从表中的对应关系可以看出getName、getColor 和getType 三个方法都获取不到对应的值,所以他们都会输出undefined。
另外,getName和getColor是bird的属性方法,getType是Bird的属性方法,如果使用Bird调用getName或getColor方法或者使用bird调用getType方法都会抛出找不到方法的错误。
对象的属性没有继承关系
除了三种子类型不可以相互调用之外还有一种情况也非常容易被误解,那就是对象的属性没有继承关系,我们看下面的例子
1 2 3 4 5 6 7 8 | function obj(){} obj.v = 1; obj.func = { logV : function (){ console.log( this .v); } }; obj.func.logV(); |
这里的obj是作为对象使用的,obj有一个属性v和一个对象属性func,func对象中又有一个logV方法,logV方法用于打印对象的v属性。logV方法打印的是func对象的v属性,但是func对象并没有v属性,所以最后会打印出undefined。这里虽然obj对象中包含v属性,但是由于属性不可以继承,所以obj的func属性对象中的方法不可以使用obj中的属性v,这一点大家一定要记住而不要和prototype的继承相混淆。
多知道点
JavaScript中的“公有属性”、“私有属性”以及“静态属性”等
在有些资料上可能会看到类似“公有属性”、“私有属性”以及“静态属性”等的名称,其实这些是基于类的语言(比如Java、C++等)中的一些概念,JavaScript并不是基于类的而是基于对象的语言,所以本身并没有这些概念,所谓的“公有属性”一般指的是使用function对象创建出来的object类型对象所拥有的属性,“私有属性”一般指function的内部变量,“静态属性”一般指function对象自己的属性。
当然,我们学习JavaScript的目的是为了使用他来实现我们的功能,而不是为了做理论上的研究,所以如果大家觉得使用那种叫法更容易理解也可以那么去叫。