慕丝4181516
在 get age() {
if(this.$age==undefined) //这里改成这样试试?
}
慕梦前来
是的。Vue采用数据劫持结合发布者-订阅者模式的方法,通过Object.defineProperty()来劫持各个属性的setter,getter属性,在数据变动话,通知订阅者,触发更新回调函数,重新渲染视图。
慕田峪0074756
《javascript权威指南》
前端大郎
set方法比较灵活。修改属性的时候会触发set方法。我感觉确实也是可以做到监听的作用。
小章鱼丸
堆栈溢出。
复制打错字了,是赋值。
铁轨跑轮船
理解对象很重要
阿崔cuicui
在js中,你这样理解是不对啊,不是在变量前面加$,
例: var $age = 20; //这个语句是定义了一个变量'$age',其值为20.
$符号本就是变量名字的一部分,'佐佐木Q'说的是大家的使用习惯,
1.如果是php,那么变量都得以$开头。 2.在js中,$开头的变量一般用来声明jquery对象,增加代码的可读性。
慕函数5127544
<!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的基础知识 也就是后端应用
Ace_____
如图所示

奔波儿灞_0001
老师不用回答了 ,是我自己懵逼了,哈哈哈,不知道怎么撤回,在这先留个言,打扰了!
兮兮酱
这一段
{
return new Date().getFullYear() - 1988;
}之后你没有写else的语句。
原因:在你设置了$age之后if判断时显示false,不执行上一段的命令,但也没有else的命令可以执行,所以默认会返回undefined。
qq_不只是看看_03455689
你是不是想到了angular 哈哈
qq_谜离_03319966
视频中是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}})
请叫我王先生0
把return去掉

琉忆
是对象上的一个方法,get方法可以获取对象中的私有变量时触发,set可以对变量进行设置时触发
深夏之叶
首先get age() 、set age(v) 其实已经相当于声明了一个age属性,但你在上面已经声明过一次,这在严格模式
下会检查出错。
然后你在get age()里试图使用this.age 会循环调用get age()方法,最终结果就是爆栈 ~_~;
另外 可以学习下chrome的调试工具的使用,通过设置断点来观察变量和执行顺序会有很大帮助
另外的另外 还是贴代码比截图好多了吧,提问窗左上角有个下拉框选择语言
bigggge
可以省略 在任何数据类型前添加一个'+'号 它可以起到的作用就相当于Number()方法 而这个就是一元加操作符 例如+'123' 那么本来应该是字符串类型的123 会转变成数字类型的123 再例如+undefined 那么undefined类型会转变成数字类型的NaN 具体如果对这个一元加操作符感兴趣 可以去具体了解一下
g0_f0r_it
$age 是属性, man.age 通过get age()获取的是$age的值,所以两者不一样
小A_
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()在
原型链中的特殊作用 ;
或许不完全正确,供你参考吧
momoyy123
+val 是弱转换,将val转换为数值类型,若转换不成数值则返回NaN, val += val 才是val = val + val
慕娘5227020
_Doogie
错了!!对于第三点,当对象用defineProperty这种方式定义属性时。且writable为false。该对象的子对象也是不可写的,所以你的obj.value再怎么更改也是1、除非你用defineProperty再去定义obj中的value属性,视频中的最后几分钟的例子就是在说明这个!!请再回去仔细看看!!
olaolaola
首先,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方法使用。
HoSalt
只是一个声明变量名。
yu233
子对象会继承父对象上的所有属性和方法。如果子对象上有与父对象相同的属性或方法,则用子对象的。
zejiaaaa
javascript 中,函数其实也是一个对象, 只要是对象就会有prototype属性,所谓继承也就是定义prototype的指向, javascript 中,多用函数来定义对象原型,方便于继承和复用,,
无兄弟不编程
Object.defineProperty(a,'x',{value:1});
因为这样定义的a的x属性是不可写的(writable:false),所以无法修改。可以将其改为以下代码,其值已被修改为100了:
Object.defineProperty(a, 'x',
{value : 100, configurable: true});
fantasyfantasy
Object.defineProperty(foo.prototype,'z',{value:1000});
通过这种方式定义的对象默认writable:false;
Object.defineProperty(new foo(),'z',{value:10}); 就OK了。
Flames