有关js原型的系列方法

最近一直在看js原型,书上讲了好多方法,总是弄混淆了,这里做一个解释总结,也算对自己学习的一种巩固

检测类方法

1.hasOwnProperty()方法

作用: 检测一个属性存在于对象实例还是原型中
返回值: 对象实例(true),原型(false)

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person();
console.log(p1.hasOwnProperty("name"));  //false
console.log(p1.hasOwnProperty("age"));   //true

2.in 操作符

作用:检测一个属性是否存在,不管存在于原型还是对象实例
返回值: 有则(true),无则(false),不管属性的位置

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person();
console.log("name" in p1);              //true
console.log("age" in p1);               //true
console.log("sex" in p1);               //false

利用这两个方法结合,可以确定该属性的位置(对象实例,或者原型)

/*
 * 判断属性是存在于对象还是原型
 *
 *  object -> 对象   name -> 要判断的属性 
 *  存在于原型中,返回true  存在于对象实例中返回false
 *  
 * */
 function hasPrototypeProperty(object, name){
    return !object.hasOwnProperty(name) && (name in object);
 }

3.isPrototypeOf()方法

作用:用来判断当前对象是否在传入的参数对象的原型链上
返回值: 在(true),不在(false)

function Person(age){
    this.age = age;
}
var p = new Person(123);
console.log(Object.prototype.isPrototypeOf(p));//true
console.log(Person.prototype.isPrototypeOf(p));//true

4.propertyIsEnumerable()方法

作用:用来检测属性(必须为实例属性,原型属性不行)是否可以在某个对象被for…in枚举
返回值: 可枚举(true),不可枚举(false)

function Person(age){
    this.age = age;
}
Person.prototype.name = "ys";

var p1 = new Person('123');

console.log(p1.propertyIsEnumerable('age'));     //true
console.log(p1.propertyIsEnumerable('name'));    //false,在原型中   

for(var i in p1){
    console.log(i); //age,name
}

5.javascript中,有两种属性

  • 数据属性:js对象属性(平日我们用到的)
var a = {
    name: 'ys',
    age: 12
}

数据属性4个特征描述值

[[Configurable]]:该特性表示是否可以通过delete操作符来删除属性,默认值是true。
[[Enumerable]]:表示是否能够通过for…in语句来枚举出属性,默认是true
[[Writable]]:表示属性值是否可以修改,默认为true
[[Value]]:表示属性的值,默认为undefined

defineProperty()方法修改特征

var obj = {
    name: 'aa'
};
console.log(obj.name);  //aa
Object.defineProperty(obj, 'name', {
    value: 'ys',
    writable: false
});
obj.name = 'cc';
console.log(obj.name);  //ys
  • 访问器属性

    [[Configurable]]:该特性表示是否可以通过delete操作符来删除属性,默认值是true。
    [[Enumerable]]:表示是否能够通过for…in语句来枚举出属性,默认是true
    [[Get]]:读取属性时调用的函数,默认是undefined
    [[Set]]:设置属性时调用的函数,默认是undefined
    
var person = {
    name: 'ys',
    _age: 12
};

Object.defineProperty(person, 'age', {
    get: function(){
        return this._age;
    },
    //val 为传入的age值
    set: function(val){
        this._age = val;
        //通过name修改age值
        this.name = val > 20 ? 'abc' : 'ys';
    }
})

console.log(person.name);   //ys
person.age = 22;
console.log(person.name);   //abc

用到set,get函数时候,当对象不具有指定的属性名称时,发生此操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值