日期:2014-05-16  浏览次数:20363 次

问一个JS的基础问题
我要给Number对象加一个add方法
为什么我非得这么写
Number.prototype.add=function(){//....}

而不能这么写
Number.add = function(){//...}

------解决方案--------------------
http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html
------解决方案--------------------
Number 在javascript里面又是一个类又是一个对象.
要对所有的类成员生效,就要加在原型也就是prototype里
直接在Number 下面加只对Number 这个对象生效,不会继承到类里面,可以视为静态方法。

------解决方案--------------------
Number是一个构造函数,换言之是一个类的标志,并不是实例,任何一个对象对会与另外一个一个对象有关联(某些特殊对象除外),这个关联以prototype属性为关键,new关键字创建实例对象会继承构造函数的原型对象的属性,而构造函数this.x所设置的属性则会成为实例对象的“类方法(java)”,但是Number.add则会成为Number构造函数对象的属性,因为javascript是面向对象的,任何东西他都可以看作是对象,尽管事实上不如此(原始类型的属性访问实际上会创建临时对象再操作),在你这个情况中,Number.add实际上是给Number构造函数绑定了属性add,你要这样去调用这个add方法

Number.add=function(){
    console.log("add");
};
var num=1;
num.constructor.add();

这是不标准的,也不方便,而且add内部上下文无法引用num...
------解决方案--------------------
基础~楼主可以仔细读一些关于“js原型链 面向对象”的一些资料。
赞成8楼的解释:

举例来说:

function Foo(){...};//此为构造函数

Foo.method1=function(){...}
//此为构造函数的方法即:静态方法,因为构造函数也是一个对象,所以静态方法是作为构造函数的一个属性而存在的。
//静态方法的调用:Foo.method()

Foo.prototype.method2=function(){...}
//此为对象方法,构造函数的prototype属性值是一个对象,prototype对象的所有属性是被实例化对象所共享的,因此对象方法method2作为prototype对象的一个属性是被所有实例化Foo后的每个对象所共享的。
//对象方法的调用:
var obj=new Foo();//首先实例化对象
obj.method2();//然后调用



静态方法是指挂靠在构造函数上的方法。
对象方法,是指在构造函数的原型中定义的,每个实例化对象都有的方法。