JavaScript Object 构造函数与核心方法详解

作者:木棉时间:2026-10-28 17:47:53浏览:320

本文详细解析 JavaScript 中 Object 构造函数的用法,包括无参与有参两种创建方式。重点介绍了 hasOwnProperty、isPrototypeOf 和 propertyIsEnumerable 三个核心方法的语法、返回值及实际应用场景,并指出 propertyIsEnumerable 在不同浏览器实现中的标准差异与潜在 Bug。

Object 构造函数与参数

构造函数

new Object(value)

参数 value 为可选参数,用于指定要转换为 Number、Boolean 或 String 对象的原始值(即数字、布尔值或字符串)。需要注意的是,JavaScript 1.1 之前的版本以及 ECMAScript Version 1 不支持此参数对象。

返回值

若未向构造函数传递 value 参数,则返回一个新建的 Object 实例。若指定了原始类型的 value 参数,构造函数将创建并返回该值的包装对象,即 Number、Boolean 或 String 对象。当不使用 new 运算符,而是将 Object() 作为普通函数调用时,其行为与使用 new 运算符时完全一致。

属性 constructor 指向一个 JavaScript 函数,该函数即为当前对象的构造函数。

方法

hasOwnProperty 方法检测

1. hasOwnProperty() 用于检查对象是否拥有局部定义的(非继承的)特定名称属性。

代码如下:

<script type="text/javascript">
var o = new Object();
o.name="Tom";
alert(o.hasOwnProperty("name")); //true
alert(o.hasOwnProperty("age")); //false
</script>

isPrototypeOf 原型判断

2. isPrototypeOf()

语法 object.isPrototypeOf(o)

参数 o 为任意对象。

返回值 若 object 是 o 的原型,则返回 true。若 o 不是对象,或者 object 不是 o 的原型,则返回 false。

描述 JavaScript 对象继承原型对象的属性。一个对象的原型通过创建并初始化该对象的构造函数的 prototype 属性引用来确定。isPrototypeOf() 方法提供了判断一个对象是否为另一个对象原型的功能,可用于确定对象的类。

示例

代码如下:

var o = new Object( ); // 创建一个对象
Object.prototype.isPrototypeOf(o) // true: o 是一个对象
Function.prototype.isPrototypeOf(o.toString); // true: toString 是一个函数
Array.prototype.isPrototypeOf([1,2,3]); // true: [1,2,3] 是一个数组
//下面是执行同样测试的另一种方法
(o.constructor == Object); // true: o was created with Object( ) constructor
(o.toString.constructor == Function); // true: o.toString is a function
/原型则对象本身于原型对象。下面的调用返回true
//说明函数继 Function.prototype和Object.prototyp属性.
Object.prototype.isPrototypeOf(Function.prototype);

propertyIsEnumerable 枚举性检测

3. PropertyIsEnumerable()

语法 object.propertyIsEnumerable(propname)

参数 propname 为包含 object 原型名字的字符串。

返回值 若 object 具有名为 propname 的非继承属性,且该属性是可枚举的(即用 for/in 循环可以枚举出它),则返回 true。

描述 使用 for/in 语句可以遍历对象“可枚举”的属性。但并非所有属性都是可枚举的,通过 JavaScript 代码添加到对象的属性通常是可枚举的,而内部对象的预定义属性(如方法)通常不可枚举。propertyIsEnumerable() 方法用于区分可枚举和不可枚举属性。需注意,ECMAScript 标准规定该方法不检测原型链,即仅适用于对象的局部属性,无法检测继承属性的可枚举性。

示例

代码如下:

var o = new Object( ); // 创建一个对象
o.x = 3.14; // 定义—个属性
o.propertyIsEnumerable("x"); // true属性x是局部的、可枚举的
o.propertyIsEnumerable("y"); //false:o没有属性y
o.propertyIsEnumerable("toString"); //false:toStrlng属性是继承的
Object.prototype.propertyIsEnumerable("toString"); // false: 枚举的

Bug

当标准限制 propertyIsEnumerable() 方法只能检测非继承属性时,这明显是错误的。Internet Explorer 5.5 按标准实现了该方法。Netscape 6.0 实现的 propertyIsEnumerable() 方法考虑了原型链。虽然这种方法可取,但它与标准冲突,因此 Netscape 6.1 修改了它,以便与 IE 5.5 匹配。由于标准中存在这个错误,因此该方法并非那么有用。

代码如下:

<script>
var obj = new Object();
obj.title = 'aaa';
obj.funb = function(a, b)
        { 
alert(a+b);
        } 
alert(obj.title);
obj.funb(1,2);
</script>

这里一种方法 ******************************

代码如下:

<script language="javascript">
function object(value,a,b){
this.title = value;
this.funb = function(){
this.a = a;
this.b = b;
alert(a+b);
                     } 
                  } 
var obj = new object("aaa",1,2);
alert(obj.title);
obj.funb();
//这里为对象添加新的方法
object.prototype.name = "123456";
alert(obj.name);
</script>

这是另一种方法

作者最新文章