2

http://jsfiddle.net/javascriptenlightenment/QvbDw/的代码片段中,作者为内置的 String 对象构造函数增加了 2 个新属性——一个数组属性和一个函数属性。

我注意到对于新的数组属性,他这样做了:

String.newArrayProperty = [];
// Q1: Why not String.prototype.newArrayProperty = []; ?

但是对于新的函数属性,他是这样做的:

String.prototype.newFunctionProperty = function() {...};
// Q2: Why not String.newFunctionProperty = function() {...}; ?

String.newProperty 和 String.prototype.newProperty 有什么区别?

4

3 回答 3

5

String.newProperty向本机函数添加一个新String属性,但该属性绝不会被它生成的字符串继承,同时String.prototype.newProperty将该新属性添加到它生成的所有字符串,但不会添加到本机函数本身。

于 2012-08-24T07:20:23.533 回答
2

String.property只是properyString类作为对象广告,String.prototype.property将此属性添加到该类的所有实例。

function F() {
}

F.p1 = function () { console.log('F.p1'); } ;
F.prototype.p2 = function () { console.log('F.prototype.p2'); } ;

F.p1(); // 'F.p1'
F.p2(); // error
new F().p1(); // error
new F().p2(); // 'F.prototype.p2'

还请看:

  1. JavaScript .prototype 是如何工作的?
  2. http://www.w3schools.com/jsref/jsref_prototype_math.asp
  3. https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/prototype
于 2012-08-24T07:19:14.570 回答
0

分配给原型的String方法可以应用于 String 的所有实例。分配给String构造函数的方法必须作为带有字符串作为参数的静态方法调用。如果方法在原型中,则在其中,this指的是字符串实例。

所以:

String.prototype.insertLineNr = function(nr){return (nr||1) + ': ' +this;};
//                                                                  ^instance
String.insertLineNo = function(str,nr){return (nr||1) + ': ' +str;};
var str = 'Some line to be numbered';
//apply to instance
console.log(str.insertLineNr(5);        //=> '5: Some line to be numbered'
//can't apply direct String method to instance 
console.log(str.insertLineNo(str,5));   //=> TypeError
//Run String method 
console.log(String.insertLineNo(str,5); //=> '5: Some line to be numbered'

如果方法名称相同,则可以两全其美:

function insrtNr(str,nr){ return (nr||1) + ': ' + str || this;};
String.insertLineNr = insrtNr;
String.prototype.insertLineNr = insrtNr;
于 2012-08-24T08:10:27.903 回答