在 get age() {
if(this.$age==undefined) //这里改成这样试试?
}
是的。Vue采用数据劫持结合发布者-订阅者模式的方法,通过Object.defineProperty()来劫持各个属性的setter,getter属性,在数据变动话,通知订阅者,触发更新回调函数,重新渲染视图。
《javascript权威指南》
set方法比较灵活。修改属性的时候会触发set方法。我感觉确实也是可以做到监听的作用。
堆栈溢出。复制打错字了,是赋值。
理解对象很重要
在js中,你这样理解是不对啊,不是在变量前面加$,
例: var $age = 20; //这个语句是定义了一个变量'$age',其值为20.
$符号本就是变量名字的一部分,'佐佐木Q'说的是大家的使用习惯,
1.如果是php,那么变量都得以$开头。 2.在js中,$开头的变量一般用来声明jquery对象,增加代码的可读性。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scal"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <script> var My={ age:100, get _age(){ console.log("get方法"); return this.age; }, set _age(val){ this.age=val; console.log("set方法"); } } console.log(My._age); console.log(My._age="120"); </script> </body> </html>
看这个稍微简单的demo,控制台查看是set方法是有执行的,可能只是你的判断逻辑不对
0-0 因为。。。emmm 这门课程 涵盖了java的基础知识 也就是后端应用
如图所示
老师不用回答了 ,是我自己懵逼了,哈哈哈,不知道怎么撤回,在这先留个言,打扰了!
这一段
{ return new Date().getFullYear() - 1988; }
之后你没有写else的语句。
原因:在你设置了$age之后if判断时显示false,不执行上一段的命令,但也没有else的命令可以执行,所以默认会返回undefined。
你是不是想到了angular 哈哈
视频中是get方法,obj是foo的实例,它本身是没有z属性的,当obj.z = 10赋值时程序发现obj并没有z这个属性,于是就像上查找foo的原型属性z,并且这个z的属性值是被get方法暴露出来的,是不能被改变的,只能通过set方法改变,你要obj的z能设置属性就要给z设置一个set方法就可以了,Object.definedProperty(obj, 'z', {set: function(val){return val}})
把return去掉
是对象上的一个方法,get方法可以获取对象中的私有变量时触发,set可以对变量进行设置时触发
可以省略 在任何数据类型前添加一个'+'号 它可以起到的作用就相当于Number()方法 而这个就是一元加操作符 例如+'123' 那么本来应该是字符串类型的123 会转变成数字类型的123 再例如+undefined 那么undefined类型会转变成数字类型的NaN 具体如果对这个一元加操作符感兴趣 可以去具体了解一下
$age 是属性, man.age 通过get age()获取的是$age的值,所以两者不一样
var foo = {}; foo.x = 1; var obj = Object.create(foo); obj.x = 2; //这里能给予赋值是很正确的,可以通俗理解为obj和foo都是普通对象,普通对象当然能给自己添加属性赋值 //只是obj这个家伙偷懒‘引用’了foo的属性。但不影响obj有权利随意给自己添加属性不受你foo的限制, //所以obj.x可以随意赋值,但注意其实这没有改变foo.x的值 var foo = {}; Object.defineProperty(foo,'x',{value:1}); var obj = Object.create(foo); //这里就不一样了,Object.defineProperty()就是皇上的圣旨,给了foo特权,这个特权就是obj必须服从 //foo的指挥,只要foo说x是什么样子,那obj的x就是什么样子,所以这里不管obj.x赋值是多少对不起你都 //和foo.x的值一样; //obj.x想要翻身当主人怎么办? 当然还是需要Object.defineProperty()给的圣旨才行; Object.defineProperty(obj,'x',{value:2}); 在这个画面的前2分钟讲了set/get会改变原型链访问的方式,里面有提及Object.defineProperty()在 原型链中的特殊作用 ; 或许不完全正确,供你参考吧
+val 是弱转换,将val转换为数值类型,若转换不成数值则返回NaN, val += val 才是val = val + val
错了!!对于第三点,当对象用defineProperty这种方式定义属性时。且writable为false。该对象的子对象也是不可写的,所以你的obj.value再怎么更改也是1、除非你用defineProperty再去定义obj中的value属性,视频中的最后几分钟的例子就是在说明这个!!请再回去仔细看看!!
首先,set方法实在给属性赋值的时候触发的函数,他参数只能传递一个(好吧,我实现想不出怎么同时赋两个值给一个属性)。如果你尝试传递多个,会报语法错误,如下:
var Person = { name:"Jobs", age:99, //定义一个change方法,可以改变Person的name和age属性,并且输出改变后的属性值 set change(name,age){ this.name = name; this.age=age; console.log("The Person's name:"+this.name+",and age:"+this.age+"."); } }; //好吧,我实现想不出怎么同时赋两个值给一个属性; Person.change = "xioming",88; //执行结果如下: Uncaught SyntaxError: Setter must have exactly one formal parameter.(…)
ok。直接传递多个是不行的。那我们换个思路。把多个参数绑定到一个对象,然后把对象作为参数传给set方法。具体如下:
var Person = { name:"Jobs", age:99, //定义一个change方法,可以改变Person的name和age属性,并且输出改变后的属性值 set change(o){ this.name = o.name; this.age=o.age; console.log("The Person's name:"+this.name+",and age:"+this.age+"."); } }; Person.change = {name:"xiaoming",age:88}; //执行结果如下: The Person's name:xiaoming,and age:88.
这样就没有问题了。根据这个,你甚至可以做到传好几个参数给set方法使用。
只是一个声明变量名。
子对象会继承父对象上的所有属性和方法。如果子对象上有与父对象相同的属性或方法,则用子对象的。
javascript 中,函数其实也是一个对象, 只要是对象就会有prototype属性,所谓继承也就是定义prototype的指向, javascript 中,多用函数来定义对象原型,方便于继承和复用,,
Object.defineProperty(a,'x',{value:1});
因为这样定义的a的x属性是不可写的(writable:false),所以无法修改。可以将其改为以下代码,其值已被修改为100了:
Object.defineProperty(a, 'x',
{value : 100, configurable: true});
Object.defineProperty(foo.prototype,'z',{value:1000});
通过这种方式定义的对象默认writable:false;
Object.defineProperty(new foo(),'z',{value:10}); 就OK了。
Object.create() 是E5的一个新特性哦,其实可以理解为继承一个对象,create方法有两个参数
一个是要继承的对象的原型,如果没有就传null,第二个参数是对象的属性描述符,这些都是E5才有的~
// Demo var a = new Object(); // 创建一个对象,没有父类哦 var b = Object.create(a.prototype); // b 继承了a的原型
具体对象的原型,属性描述符这些概念可以先去百度学习下哈。我就不详细说了,希望能帮到你