将对象原型用作默认值有多好?

时间:2015-12-03 13:21:37

标签: javascript

Array.prototypeFunction.prototype之类的东西都返回空函数,并且已经创建和内置,所以将它们用作默认值是多么好的想法,如:

function isThisCool(vals,fn,rx) {
  vals = vals || Array.prototype;
  fn = fn || Function.prototype;
  rx = rx || RegExp.prototype;
}

使用空文字的明显优势是它们只创建一次,每次都会创建空文字。

3 个答案:

答案 0 :(得分:1)

我认为使用这种方法你需要担心的一件事是你可能最终扩展原生原型,这通常被认为是不好的做法。在您的示例中:

function isThisCool(vals) {
  vals = vals || Array.prototype;
}

如果您执行vals.foo = 5;之类的操作,那么您在此之后创建的每个数组现在都具有foo属性5,如您所见:

var arr = [1, 2, 3];
arr.foo; // => 5

当然,向数组添加属性是没有意义的,但这只是一个例子。

如果你按照正常的方式做到了:

function isThisCool(vals) {
  vals = vals || [];
}

如果您Array.prototype vals.foo = 5;,则不会延长var arr = [1, 2, 3]; arr.foo; // => undefined 的问题:

foreach( $_COOKIE as $key => $value ) {
  if( strpos( $key, 'ticketRecon_ID-' ) === false ) continue;
  else {
    setcookie( $key, '', time() - 1 );
    unset( $_COOKIE[$key] );
  }
}

如果你不打算扩展任何这些原型,它可能不会成为一个问题。

答案 1 :(得分:0)

问题是,使用这些作为默认值通常会导致这些原型的意外修改。因为正如你所说,这些只创造一次。这是重复调用Array.prototype.push的效果:

console.log("Push returns: ", Array.prototype.push("dd"));

image description

这也会影响其他阵列。虽然他们会正确报告length,但可以访问这些值:

Array.prototype.push("dd");
var empty = [];
console.log(empty.length, empty[0]);

image description

可以将原型用于只读操作。我不推荐它。如果您担心性能问题,至少要创建自己的静态默认值:

 var default_array = [];
 var default_function = function(){};
 var default_regexp = new RegExp("");

此外,关于RegExp,默认值的行为方式非常值得怀疑。默认RegExp是否始终匹配或始终失败?

答案 2 :(得分:0)

我认为根本不是一个好主意。我可以看到很多原因:

  • 不可读的代码
  • 无意中使用语言特征
  • 容易出错(参考)

例如,如果您稍后再做:

vals.push(aValue);

你实际上正在修改“共享”数组。从 Array.prototype 初始化的每个数组都将受到影响。