js深度分析__proto__

责编:menVScode 2017-09-14 22:58 阅读(812)

         __proto__:每一个对象拥有的属性,指向的是当前对象自身构造函数关联的原型对象;不可枚举属性(隐藏属性),不能通过for-in循环将值遍历出来。

        在js语言内置结构中,针对于对象会有一个数据劫持,当访问obj.name的时候,就能输出其值。数据劫持就是当我们访问一个对象或者改变对象属性值的时候,就会存在(激活)数据劫持,就会调用一个钩子函数。数据劫持默认是不激活的。

var obj={     //{}  对象
    name:"menvscode.com",
    age:1
};
obj.name="MVC"; //set钩子函数
console.log(obj.name); //get钩子函数 
console.log(obj);
console.log(obj.prototype);
console.log(obj.__proto__);

        __defineGetter__、__defineSetter__是定义在Object.prototype原型对象上面的。

var obj={    
    name:"menvscode.com",
    age:1
};

obj.__defineGetter__("name",function(){   //钩子函数
    return 'MVC前端网';
});
console.log(obj.name);//MVC前端网 若钩子函数什么都不返回,结果为undefined

obj.name = 'MVC';
console.log(obj.name);//结果还是:MVC前端网
//获取对象的属性值,激活了数据劫持进行监听,就会调用当前的钩子函数,将函数的返回值作为name的值。

        不用钩子函数绑定也能获取name的值,现在大费周章的原因是为了学习MVVM数据双向绑定。

var obj={
	  name:"menvscode.com",
	  age:1
};

obj.__defineGetter__("name",function(){   //钩子函数  获取
    return this.str;
});

obj.__defineSetter__("name",function(val){  //设置
    this.str = val; //this指向当前的obj对象
    console.log(val); //menVScode
});

obj.name='menVScode';
console.log(obj.name);//menVScode

        defineProperty()作用跟__defineGetter__、__defineSetter_是一样的,不过它是Object的一个静态方法,那两个是是定义在Object.prototype原型对象上面的。      

var obj={     //{}  对象
	  name:"menvscode",
	  age:30
};
Object.defineProperty(obj,"age",{   //对象   描述对象
          get:function(){
          },
          set:function(){ }
});

obj.name="mvc";
console.log(obj.age)
标签: __proto__ mvvm
前端交流群: MVC前端网(menvscode.com)-qq交流群:551903636

邮箱快速注册

忘记密码