js对象6-对象的三个特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21719315/article/details/82493866

每一个对象(实例)都有与之相关联的三个特性:原型、类和可扩展性。下面讲解这些属性。

原型属性

在对象的定义中,我们知道,每个对象都和一个原型对象相关联。那么是如何关联的?

每个对象都有一个原型属性([[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(),除了能将对象设置为不可扩展外,还可以将对象的自身属性设置为不可配置的。(设置)

 

猜你喜欢

转载自blog.csdn.net/qq_21719315/article/details/82493866