defineProperty

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>属性的操作</title>
</head>
<body>
    <script type="text/javascript">

        //bind 兼容
        if(!Function.prototype.bind){
            Function.prototype.bind = function(scope){
                var _this = this;
                return function(){
                    _this.call(scope);
                }
            }
        }
        /**
         * getter: 获取某一个对象的某个属性之前会回调的这个属性的getter的钩子函数
         * setter: 设置某一个对象的某个属性之前会回调的这个属性的setter的钩子函数
         *
         *一个对象的任意属性在没有设置setter和getter钩子函数的时候,默认系统有实现
         */
        var model = {
            name: "star",
            message: "this is message",
            isShow: true
        };
        //
        function observerFactory(model){
            for (var property in model ){
                addOSer(model, property, model[property]);
            }
        }
        function addOSer(model, property, value){
            Object.defineProperty(model, property,{
//            value:"star",
//            writable:false,//是否可写入
                enumerable: true,//是否可meiju
                configurable: false,//是否以后还可以配置name属性
                set:function(nvalue){
                    console.log("进入set设置");
                    this.value = nvalue;
                },
                get:function(){
                    console.log("进入get设置");
                    return this.value;
                }
            });
        }
        observerFactory(model);
        model.name = "xxx";

//        function observerFactory(model){
//            for (var property in model){
//                model.__defineSetter__(property, function(value){
//                    /**
//                     * 问题:property循环出来的一直是isShow,
//                     * 原因:闭包问题, observerFactory(model);执行了3次,所以property输出来的一直是isShow
//                     * 解决办法:用ES6语法,把var改成let(let指的是:只在当前的作用域有用)
//                     */
//                    console.log("已经进入了"+ property +"属性的setter");
//                    this.value = value;
//                });
//                model.__defineGetter__(property, function(){
//                    console.log("已经进入了"+ property +"属性的getter");
//                    return this.value;
//                });
//            }
//        }
//        observerFactory(model);
        /**
         * 我们可以在对象的原型链上找到这些方法,有些方法不是不存在,而是我们不关心它,
         * __defineGetter__(定义Getter):只要看到下划线开头的属性或者函数,代表是隐私的意思,不想让外面访问或者更改
         * __defineGetter__基于原型链的,所以每个对象都有__defineGetter__方法
         *
         * Object.defineGetter(); 静态方法 static model,准许我们使用的
         * __defineGetter__(私有的,可以调用)和Object.defineGetter()区别:
         * __defineGetter__私有的,可以调用,但是javascript引擎想告诉我们最好不要这个用,强行用也是可以的,
         * javascript提供了Object.defineGetter方法,这个方法和__defineGetter__一样,推荐使用Object.defineGetter方法
         */
//         model.__defineSetter__("message", function(value){
//             console.log("已经进入了message属性的setter");
//             this.value = value;
//         });
//         model.__defineGetter__("message", function(){
//             console.log("已经进入了message属性的getter");
//             /**
//              * (强行使用__defineGetter__):这里的this指的model本身,
//              */
//             return this.value;
//         });
        /**
         * 返回“undefined
         * 原因:当我们访问message属性的时候,__defineGetter__的钩子函数拦截了
         * 当我们访问message的时候,会先调用get message钩子函数,this.value是undefined,
         * 所以返回的是undefined
         *
         *解决办法:需要先设置在获取,先setter再getter
         */
//        model.name = "stas";
        console.log(model.name);
    </script>
</body>
</html>

  

时间: 2024-10-20 12:51:34

defineProperty的相关文章

Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解

在现在比较新的框架中, 比如 reactjs, vuejs中用得很多的一个属性便是 Object.defineOProperty 此属性的文档在网上一搜, 其中的几个属性, 包括 存取描述符(有set和get的) 和 数据描述符(直接有 value 的就是数据描述符) 有 set get 有 value writable enumerable configurable 虽然有 set 和 get, 但是定义的时候还是要用到 enumerable 和 configurable set 和 get

Object.defineProperty小解

最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定 先看一个实例: var o= {name: 'a'} Object.defineProperty(o, 'value', { value: 3, writable: true, enumerable: true, cofigurable: true }) console.log(o.value) //3 三个参数,分别是目标对象.属性名称.参数对象 value:属性值 writabl

解析神奇的 Object.defineProperty

这个方法了不起啊..vue.js是通过它实现双向绑定的..而且Object.observe也被草案发起人撤回了..所以defineProperty更有必要了解一下了. 几行代码看他怎么用 var a= {} Object.defineProperty(a,"b",{ value:123 }) console.log(a.b);//123 很简单,它接受三个参数,而且都是必填的.. 传入参数 第一个参数:目标对象 第二个参数:需要定义的属性或方法的名字. 第三个参数:目标属性所拥有的特性

MVVM双向绑定实现之Object.defineProperty

随着web应用的发展,直接操作dom的应用已渐行渐远,取而代之的是时下越来越流行的MVVM框架,dom操作几乎绝迹,这里面自然是框架底层封装的结果.MVVM框架的双向数据绑定使开发效率大大提高:然后在实现这些双向数据绑定时,使用ES7原生的Object.observe方法则是完美解决方案,但是遗憾的是该方法目前还是ES7的草案阶段,各浏览器还不支持,目前chrome 36+支持该方法. 既然Object.observe不被支持,但是其替代方案是ECMAScript 262v5带来的新东西Obje

Javascript Object.defineProperty()

转载声明: 本文标题:Javascript Object.defineProperty() 本文链接:http://www.zuojj.com/archives/994.html,转载请注明转自Benjamin-专注前端开发和用户体验 Javascript作为一种语言,有个美誉,开发者可以重新定义任何事情.虽然这在过去的一些javascript可以,但是ECMAScript5中已经开始得到改变,例如,我们可以使用Object.defineProperty创建一个不能被修改的对象的属性.本文中我们

Object.defineproperty实现数据和视图的联动

Object.defineproperty语法 在一个对象上定义新的属性 var o = {}; // 创建一个新对象 // Example of an object property added with defineProperty with a data property descriptor Object.defineProperty(o, "a", {value : 37, writable : true, enumerable : true, configurable :

Object.defineProperty(obj,prop,descriptor)简单使用

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>javascript test</title> <script type="text/javascript" src="js/jquery.min.js"></script> <style> body { padding:

Object.defineProperty与修改某个数组实现监听效果

1.Object.defineProperty Object.defineProperty具体资料:传送门 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script> /*Object.defineP

Js中的Object.defineProperty

通过Object.defineProperty为对象设置属性,并同时规定属性的属性(可见性,可配置性,可枚举性等) 备注:如果通过var obj = {} obj.age = 18这种方式设置的属性,他的可见性,可配置性,可枚举性等都为true,相当于默认设置了本篇讨论的各种属性都为true 语法:Object.defineProperty(obj, prop, descriptor) 第一个参数:目标对象第二个参数:需要定义的属性或方法的名字.第三个参数:目标属性所拥有的特性.(descrip

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象。

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法EDIT Object.defineProperty(obj, prop, descriptor) 参数 obj 需要定义属性的对象. prop 需定义或修改的属性的名字. descriptor 将被定义或修改的属性的描述符. 返回值 返回传入函数的对象,即第一个参数obj 描述EDIT 该方法允许精确添加或修改对象的属性.一般情况下,我们为对象添加属性是通过