本节书摘来自异步社区《JavaScript启示录》一书中的第1章,第1.20节,作者:【美】Cody Lindley著,更多章节内容可以访问云栖社区“异步社区”公众号查看
在JavaScript中,对象在任何时候都可以扩展(即动态属性)。正如前面提到的,确切地说,JavaScript拥有易变对象(mutable object)。这意味着通过构造函数创建的对象可以扩展属性。
下面的代码通过Array()构造函数创建了一个实例,然后利用其属性进行扩展。
<!DOCTYPE html><html lang="en"><body><script> var myArray = new Array(); myArray.prop = 'test; console.log(myArray.prop) // 输出 'test' </script></body></html> 通过Object()、RegExp()或者任何其他非原生构造函数,甚至是Boolean(),都可以实现同一目的。 Fiddle地址:http://jsfiddle.net/javascriptenlightenment/GnbPf/ <!DOCTYPE html><html lang="en"><body><script> // 原生构造函数创建的对象也可以实现同一目的 var myString = new String(); var myNumber = new Number(); var myBoolean = new Boolean(true); var myObject = new Object(); var myArray = new Array(); var myFunction = new Function('return 2+2'); var myRegExp = new RegExp('\bt[a-z]+\b'); myString.prop = 'test'; myNumber.prop = 'test'; myBoolean.prop = 'test'; myObject.prop = 'test'; myArray.prop = 'test'; myFunction.prop = 'test'; myRegExp.prop = 'test'; // 输出 'test', 'test', 'test', 'test', 'test', 'test', 'test' console.log(myString.prop, myNumber.prop, myBoolean.prop, myObject.prop, myArray.prop, myFunction.prop, myRegExp.prop); // 注意:原始值/字面量不能实现该功能 var myString = 'string'; var myNumber = 1; var myBoolean = true; myString.prop = true; myNumber.prop = true; myBoolean.prop = true; // 输出undefined, undefined, undefined console.log(myString.prop, myNumber.prop, myBoolean.prop); </script></body></html>向通过构造函数创建的对象添加属性的情况并不少见。请记住:通过构造函数创建的对象实例只是普通对象。
注意
请记住,除了自己的属性外,实例还可以拥有继承自原型链的属性。或者,正如上述代码所示,实例化后属性被添加至构造函数,这强调了JavaScript中对象的动态特性。