每一个对象(实例)都有与之相关联的三个特性:原型、类和可扩展性。下面讲解这些属性。
原型属性
在对象的定义中,我们知道,每个对象都和一个原型对象相关联。那么是如何关联的?
每个对象都有一个原型属性([[prototype]]),它是一个内部属性,在浏览器实现中表现为_proto_属性。它是一个指针,指向原型对象。
所有字面量创建的对象有一个相同的原型对象(Object.prototype)。
使用new关键字创建的对象,原型为构造函数prototype属性的值(比如,数组的原型对象为Array.prototype)同时也继承Object.prototype。
类属性
对象的类属性(class)是一个字符串,用以表明该对象为何种类型。
该属性为只读属性。
默认的toString方法(继承自Object.prototype),将返回[object class],即[object 类属性]
如果想获得对象的类,可以调用对象的toString(),然后提取已返回字符串的第8个到倒数第二个位置之间的字符串([object class])。不过,由于很多对象的toString()方法重写了,为了调用正确的toString()版本,必须间接调用Function.call()方法。
function Student(school, major, name, age) {
this.school = school;
this.major = major;
this.name = name;
this.age = age;
}
var student = new Student("清华大学", "软件工程", "张三", "19");
function Student1(school,major,name,age){
this.school=school;
this.school=major;
this.name=name;
this.age=age;
}
Student1.prototype.sayName=function(){
alert(this.name);
}
var student2=new Student1("清华大学","软件工程","李四",26);
function classOf(obj) {
if (obj == null) return Null;
if (obj == undefined) return Null;
return Object.prototype.toString.call(obj).slice(8, -1);
}
console.log(classOf(student)); //返回Object
console.log(classOf(student2)); //返回Object
console.log(classOf(new Date())); //返回Date
可扩展属性
对象的可扩展性,用以表示该对象是否可以新添属性。
所有内置对象和自定义对象都是显式可扩展的,宿主对象的可扩展性是由JavaScript引擎定义的。
通过方法object.isExtensible(),来判断对象是否可扩展。(查询)
通过方法object.preventExtensions(),将对象转换为不可扩展的。注意:一旦将对象转换为不可扩展,就无法将转换为可扩展的。(设置)
object.seal()和object.preventExtensions(),除了能将对象设置为不可扩展外,还可以将对象的自身属性设置为不可配置的。(设置)