js关于字面量与构造函数创建对象的几点理解
2014-03-06 08:53
288 查看
转载自:http://my.oschina.net/bothyan/blog/125668
一、在javascript中没有所谓的空对象,即使最简单的{}也具有从Object.prototype继承的方法和属性。
二、创建的对象的俩种等价的方法:使用字面量方法创建对象:var oschina = {goes:"far"}; 使用内置构造函数创建对象:var oschina = new Object(); car.gose = "far"。我们应该尽量使用字面量发创建对象,其显著优点在于它仅仅输入更短的字符。但是选择它还有以下几个更重要的原因:
1、选择字面量法创建对象强调该对象仅是一个可变的hash映射,而不是从对象中提取的属性或方法。
2、对使用Object构造函数相对,使用字面量在于它并没有作用域解析。因为可能以同样的名字创建一个局部函数,解释器需要从调用Object(0的位置开始一直向上查询作用域链,知道发现全局Object构造函数。
3、构造函数Object可以仅接受一个参数,并且还依赖传递的值,该OBject()可能会委派另一个内置函数来创建对象,并且返回了一个并非期望的不同对象。如将数字、字符串、布尔值当做参数传递给Object构造函数,其结果是获得了以不同构造函数所创建的对象,例如:var oschina = new Object(1);ochina.constructor为Number;传递的值是动态的,直到运行时才确定其类型,这种行为会导致意想不到的结果。
三、构造函数仍然是函数,但它需要用new操作符调用,若忘记用new操作符会导致构造函数中的this指向全局对象
(浏览器中指向window),如下面代码:
四、检查数组性质。当数组作为操作数并使用typeof操作符时,其结果会返回"object",因为数组也是对象。但是这对于排除错误没有什么帮助,通常我们需要知道某个值是否为一个数组。有时候检查代码可以用是否存在length属性或一些数组方法,但是这些检查并非万能,我们无法确定一个非数组对象就不能拥有这些属性和方法。还可以使用instanceof Array进行检查,但是这种检查存在兼容性问题。
ECMAScript 定义了Array.isArray(),方法,接受参数为数组时返回true。但是有些环境不支持这种方法,最好的检查数组性质的方法是Object.prototype.toString.call方法,若是数组会返回[object Array],若是对象则为[object object]。因此要用如下方法检测:
五、在一般情况下,除了Date()构造函数以外,很少需要用其他内置构造函数。
一、在javascript中没有所谓的空对象,即使最简单的{}也具有从Object.prototype继承的方法和属性。
二、创建的对象的俩种等价的方法:使用字面量方法创建对象:var oschina = {goes:"far"}; 使用内置构造函数创建对象:var oschina = new Object(); car.gose = "far"。我们应该尽量使用字面量发创建对象,其显著优点在于它仅仅输入更短的字符。但是选择它还有以下几个更重要的原因:
1、选择字面量法创建对象强调该对象仅是一个可变的hash映射,而不是从对象中提取的属性或方法。
2、对使用Object构造函数相对,使用字面量在于它并没有作用域解析。因为可能以同样的名字创建一个局部函数,解释器需要从调用Object(0的位置开始一直向上查询作用域链,知道发现全局Object构造函数。
3、构造函数Object可以仅接受一个参数,并且还依赖传递的值,该OBject()可能会委派另一个内置函数来创建对象,并且返回了一个并非期望的不同对象。如将数字、字符串、布尔值当做参数传递给Object构造函数,其结果是获得了以不同构造函数所创建的对象,例如:var oschina = new Object(1);ochina.constructor为Number;传递的值是动态的,直到运行时才确定其类型,这种行为会导致意想不到的结果。
三、构造函数仍然是函数,但它需要用new操作符调用,若忘记用new操作符会导致构造函数中的this指向全局对象
(浏览器中指向window),如下面代码:
function abc(){ this.after = "def"; } //定义对象 var oschina = new abc(); alert(typeof oschina); //'object' alert(oschina.after);//'def'; var oschina = abc(); alert(typeof oschina); //'undefined' alert(window.after);//'def';
四、检查数组性质。当数组作为操作数并使用typeof操作符时,其结果会返回"object",因为数组也是对象。但是这对于排除错误没有什么帮助,通常我们需要知道某个值是否为一个数组。有时候检查代码可以用是否存在length属性或一些数组方法,但是这些检查并非万能,我们无法确定一个非数组对象就不能拥有这些属性和方法。还可以使用instanceof Array进行检查,但是这种检查存在兼容性问题。
ECMAScript 定义了Array.isArray(),方法,接受参数为数组时返回true。但是有些环境不支持这种方法,最好的检查数组性质的方法是Object.prototype.toString.call方法,若是数组会返回[object Array],若是对象则为[object object]。因此要用如下方法检测:
if(typeof Array.isArray === "undefined"){ Array.isArray = function(arg){ return Object.prototype.toString.call(arg) === "[object Array]"; }; } //调用Array.isArray()
五、在一般情况下,除了Date()构造函数以外,很少需要用其他内置构造函数。
相关文章推荐
- 关于js中对对象原型和构造函数的一些理解
- 关于js中,原型对象,原型链,构造函数,实例之间关系的理解与区别
- js中的字面量与构造函数创建对象
- js中构造函数创建对象加不加new的问题
- js中组合使用构造函数模式和原型模式创建对象
- js中创建对象时,工厂方式与构造函数方式中this的区别
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- js 创建对象的三种方式——工厂模式、构造函数模式、原型模式
- 在JS中组合使用构造函数模式和原型模式创建对象
- js 中创建对象 构造函数 this
- js中组合使用构造函数模式和原型模式创建对象
- 对JS关于对象创建的几种方式的整理
- [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
- 浅谈js对象的创建和对6种继承模式的理解和遐想
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象
- js中通过构造函数创建对象
- 关于JS接口创建对象的总结
- js 创建对象的两种主要方法 构造函数 和 原型+构造函数组合
- JS的特殊函数:构造函数,直接创建对象
- JavaScript构造函数及原型对象 使用Object或对象字面量创建对象 工厂模式创建对象 构造函数模式创建对象 原型模式创建对象 构造与原型混合模式创建对象