使用内置的Object()构造函数,我们可以动态创建通用的空对象。事实上,如果你记得第一章的开头,这正是我们通过创建cody对象所做的。让我们重新创建科迪对象。
例如:sample69.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gtvar Cody = new Object();//创建一个没有属性的空对象。for(key in cody){//确认Cody是一个空的泛型对象。if(Cody。hasownproperty(key)){ console。log(key);//应该看不到任何日志,因为cody本身没有属性。} } & lt/script & gt;& lt/body & gt;& lt/html & gt;在这里,我们所做的就是使用Object()构造函数创建一个名为cody的通用对象。您可以将Object()构造函数视为创建没有预定义属性或方法的空对象的统一工具(当然,从原型链继承的对象除外)。
如果不明显的话,Object()构造函数本身就是一个对象。也就是说,构造函数基于从函数构造函数创建的对象。这可能会令人困惑。记住,像数组构造函数一样,对象构造函数只是抛出一个空白对象。是的,你可以创建所有你喜欢的空对象。然而,创建像cody这样的空对象与创建自己的带有预定义属性的构造函数有很大不同。请确保您理解cody只是一个基于Object()构造函数的空对象。要真正利用JavaScript的强大功能,您不仅需要学习如何从Object()创建空对象容器,还需要学习如何构建自己的对象“类”(Person(),例如Object()构造函数本身。
Object()参数Object()构造函数采用一个可选参数。此参数是您要创建的值。如果不提供任何参数,将假定值为空或未定义。
例如:sample70.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gt//创建一个没有属性的空对象。var Cody 1 = new Object();var cody2 =新对象(未定义);var cody3 =新对象(空);console.log(代码类型1、代码类型2、代码类型3);//日志“对象对象对象”。& lt/script & gt;& lt/body & gt;& lt/html & gt;如果将null或undefined以外的值传递给对象构造函数,则传递的值将被创建为对象。所以从理论上讲,我们可以使用Object()构造函数来创建任何其他带有构造函数的原生对象。这就是我在下一个例子中所做的。
例如:sample71.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gt/*使用Object()构造函数创建字符串、数字、数组、函数、布尔和正则表达式对象。*///以下日志确认对象创建。console。log(new Object(‘foo‘));console.log(新对象(1));console.log(新对象(【】));console . log(new Object(function(){ });console.log(新对象(true));console.log(新对象(/ Bt【a-z】+ b/));/*通过object()构造函数创建字符串、数字、数组、函数、Boolean和regex对象实例实际上从未完成过。我只是在证明这是可以做到的。*/& lt;/script & gt;& lt/body & gt;& lt/html & gt;Object()属性和方法Object()对象具有以下属性(不包括继承的属性和方法):
属性(Object.prototype):
原型对象()实例属性和方法对象()实例具有以下属性和方法(不包括继承的属性和方法):
实例属性(var my object = { };myObject.constructor):
构造函数实例方法(var my object = { };my object . tostring();):
hasownproperty()isprototypeof()propertysenumerable()to localstring()to string()value of()原型链以Object.prototype结束,因此Object()的所有属性和方法都将被所有JavaScript对象继承。
创建带有对象文献的对象()创建对象文献需要用大括号实例化带有或不带有属性的对象(var Cody = { };)。还记得在第一章开始时,我们创建了一个一次性的cody对象,然后使用点表示来赋予cody对象属性吗?让我们再做一次。
例如:sample72.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gtvar Cody = new Object();cody.living = truecody.age = 33Cody . gender =‘male‘;Cody . get gender = function(){ return Cody . gender;};console . log(Cody);//记录cody对象和属性。& lt/script & gt;& lt/body & gt;& lt/html & gt;请注意,在代码中创建cody对象及其属性需要五条语句。使用对象文字表示,我们可以在一句话中表达相同的cody对象。
例如:sample73.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gtvar cody = {living: true,年龄:23,性别:‘男性‘,get gender:function(){ return Cody . gender;}};//注意最后一个属性后面没有逗号。console。log(Cody);//记录cody对象及其属性。& lt/script & gt;& lt/body & gt;使用文字符号使我们能够创建对象(包括定义的属性)并以较少的代码直观地封装相关数据。请注意在单个语句中使用:和运算符。由于其简单性和可读性,这实际上是在JavaScript中创建对象的首选语法。
您应该知道属性名也可以指定为字符串:
例如:sample74.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gtvar Cody = {“living”:true,“age”:23,“gender”:“male”,“getGender”:function(){ return Cody . gender;}};console . log(Cody);//记录cody对象及其属性。& lt/script & gt;& lt/body & gt;没有必要将属性指定为字符串,除非属性名称:
是保留的关键字之一(class)。包含空格或特殊字符(除数字、字母、美元符号($)或下划线(_)以外的任何字符)。从一个数字开始。小心!对象的最后一个属性不应有尾随逗号。这可能会在某些JavaScript环境中导致错误。
特殊的是所有对象都继承自Object.prototypeJavaScript中的object()构造函数,因为它的prototype属性是原型链中的最后一站。
在下面的示例中,我使用foo属性来扩展Object.prototype,然后创建一个字符串并尝试访问foo属性,就像它是字符串实例的属性一样。由于myString实例没有foo属性,原型链启动并在String.prototype中查找值。它不在那里,因此下一个要查找的位置是Object.prototype,这是JavaScript查找对象值的最终位置。找到了foo值,因为我添加了它,所以它返回了foo值。
例如:sample75.html
& lt!DOCTYPE html & gt& lthtml lang = & quoten & quot& gt& ltbody & gt& lt脚本& gtobject . prototype . foo =‘foo‘;var myString =‘bar‘;//Logs“foo”,通过prototype chain . console . log(mystring . foo)在Object.prototype.foo中找到;& lt/script & gt;& lt/body & gt;结语小心!添加到Object.prototype的任何内容都将显示在for in循环和prototype链中。所以说禁止换对象。