本地对象:ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。
简单来说,本地对象就是 ECMA-262 定义的类(引用类型)
内置对象:ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,
在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。ECMA-262 只定义了两个内置对象,
即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。
宿主对象:所有非本地对象都是宿主对象(host object),即由 ECMAScript 实现的宿主环境提供的对象。
所有 BOM 和 DOM 对象都是宿主对象。
enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
// hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
// Ie8以下不支持dom. hasOwnProperty 方法。
// isPrototypeOf是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。
1、hasOwnProperty
作用:是用来判断一个对象是否有你给出名称的属性或对象。
调用方式:object.hasOwnProperty(proName)
参数:object(必须) 对象的实例;proName(必须) 一个属性名称的字符串值
注意:如果 object 具有带指定名称的属性,则 hasOwnProperty 方法返回 true,否则返回 false。
此方法不会检查对象原型链中的属性。
该属性必须是对象本身的一个成员。
Internet Explorer 8 和低于其的版本的宿主对象不支持该属性。
代码举例:
在下面的示例中,所有 String 对象共享一个公共 split 方法。 下面的代码将显示 false 和 true。
var s = new String("Sample");
console.log(s.hasOwnProperty("split"));
console.log(String.prototype.hasOwnProperty("split"));
2、in 运算符
作用:测试一个对象中是否存在一种属性。
调用方式:result = property in object
参数:result(必须) 任何变量;proName(必须) 计算结果为字符串表达式的表达式;object(必须) 任意对象
注意:in 运算符确定对象中是否有名为 property 的属性。 它还确定属性是否为对象的原型链的一部分。
代码举例:
code1:
var myObject = new Object();
myObject.name = "James";
myObject.age = "22";
myObject.phone = "555 0234";
if ("phone" in myObject) {
console.log("property is present");
} else {
console.log("property is not present");
}
code2:
console.log("toString" in "zheyang");
console.log("toString" in new String("zheyang"))
思考: var aa = "zheyang" 与 aa = new String("zheyang") 的区别
3、valueOf
作用:返回指定对象的原始值。
调用方式:object.valueOf();
注意:在JS里数字其实都是浮点数。
代码举例:
var aa = 123
console.log(aa.valueOf())
console.log(123.valueOf())
console.log(123..valueOf())
console.log((123).valueOf())
4、typeof
作用:返回指定对象的类型。
调用方式:typeof object;
代码举例:
var aa = 12;
var bb = new Number(12)
console.log(typeof aa)
console.log(typeof bb)
5、instanceof
作用:返回一个布尔值,该值指示一个对象是否为特定类或构造函数的一个实例。
调用方式:object instanceof class;
参数:object(必须) 一个对象;class(必须) 任何对象类或构造函数;
注意:如果 object 是 class 或构造函数的实例,则 instanceof 运算符返回 true。
如果 object 不是指定类或函数的实例,或者 object 为 null,则返回 false。
JavaScript Object 很特殊,当且仅当对象用 Object 构造函数构造时,对象才被视为 Object 的实例。
代码举例:
function ClassA() {
}
function ClassB() {
}
ClassB.prototype = {
constructor: ClassA
}
function ClassC(){
ClassA.call(this);
}
function ClassD(){}
var obj = new ClassA
var obj2 = new ClassB;
var obj3 = new ClassC;
ClassD.prototype = obj2;
var obj4 = new ClassD;
console.log(obj instanceof ClassA)
console.log(obj2 instanceof ClassB)
console.log(obj2 instanceof ClassB)
console.log(obj3 instanceof ClassA)
console.log(obj4 instanceof ClassA)
console.log(ClassA instanceof Function)
6、isPrototypeOf
作用:确定一个对象是否存在于另一个对象的原型链中。
调用方式:prototype.isPrototypeOf(object)
参数:prototype(必须) 对象原型;object(必须) 另一个对象,将对其原型链进行检查
注意:如果 object 的原型链中具有 prototype,则 isPrototypeOf 方法返回 true。
原型链用于在同一个对象类型的不同实例之间共享功能。
当 object 不是对象或当 prototype 没有出现在 object 的原型链中时,isPrototypeOf 方法返回 false。
代码举例:
function Rectangle() {}
var rec = new Rectangle();
cosole.log(Rectangle.prototype.isPrototypeOf(rec));
7、propertyIsEnumerable
作用:返回布尔值,该值指示指定属性是否为对象的一部分以及该属性是否是可枚举的。
调用方式:object.propertyIsEnumerable(propName)
参数:object(必须) 对象实例;propName(必须) 一个属性名称的字符串值;
注意:如果 propName 存在于 object 中且可以使用一个 For...In 循环枚举出来,则 propertyIsEnumerable 属性将返回 true。
如果 object 不具有所指定名称的属性或者所指定的属性不是可枚举的,则 propertyIsEnumerable 属性将返回 false。
通常,预定义的属性不是可枚举的,而用户定义的属性总是可枚举的。
propertyIsEnumerable 属性不考虑原型链中的对象。
代码举例:
var a = new Array("apple", "banana", "cactus");
var s = a.propertyIsEnumerable(1);
console.log (s);
8、toString / toLocaleString
作用:可把一个对象转换为字符串,并返回结果。
调用方式:object.toString(num)
参数:object(必须) 对象;num(非必须) ;
注意:如果对象是数子,则参数可为要转换的进制数,默认为10
如果是布尔类型,则会转换为对应的字符串
代码举例:
var aa = 123
console.log(aa.toString(2))
var bb = new Boolean(true)
console.log(bb)
9、constructor
代码举例: constructor.parent
10、 Function 与 Object
Function:
首先回顾一下函数对象的概念,函数就是对象,代表函数的对象就是函数对象。
所有的函数对象是被Function这个函数对象构造出来的。
也就是说,Function是最顶层的构造器。
它构造了系统中所有的对象,包括用户自定义对象,系统内置对象,甚至包括它自已。
这也表明Function具有自举性(自已构造自己的能力)。
这也间接决定了Function的[[call]]和[[constructor]]逻辑相同。
Object:
对于Object它是最顶层的对象,所有的对象都将继承Object的原型,
但是你也要明确的知道Object也是一个函数对象,
所以说Object是被Function构造出来的。
代码举例:
alert(Function instanceof Function);//true
alert(Function instanceof Object);//true
alert(Object instanceof Function);//true
function Foo() {};
var foo = new Foo();
alert(foo instanceof Foo); // true
alert(foo instanceof Function); // false
alert(foo instanceof Object); // true
alert(Foo instanceof Function); // true
alert(Foo instanceof Object); // true