get/set方法
get+属性名+函数体(获得时调用此函数),
set+属性名+函数体(赋值时调用)
object.create(x)方法会返回一个对象y,y的属性基于x的属性
//读写对象的属性
undefined
//1、属性读写
undefined
var obj = {x:2,y:3}
undefined
obj.x
2
//下面是属性继承和属性枚举的知识,首先是关于属性继承要求是你在创建的时候就要说明的,比如说是
undefined
//上面是两种的方式
undefined
//当然也可以for in 去遍历,但是问题就是会把原型链上的也弄出来,而且顺序不一定
undefined
//还可以用hasOwnProperty
undefined
//这集讲的是关于get和set的方法
undefined
//上集由于脑袋问题没有录上,气死了
undefined
var man = {name:'Boso',weibo:'@Bosn',get age(){return new Date().getFullYear()-2000;},set age(val){console.log('Age can\'t be set to'+val);}}
undefined
console.log(man.age)
VM7522:1 21
undefined
man.age
21
man.age = 100
VM7469:1 Age can't be set to100
100
//这个里面就是有一个get和set进行赋值
undefined
//下面是一种更加高级的做法
undefined
var man = {
weibo:'@Bosn',
}
undefined
6006:1 Uncaught (in promise) DOMException: The play() request was interrupted by a call to pause(). https://goo.gl/LdLk22
var man = {
weibo:'@Bosn',
$age:null,//这个情况下就是将age作为一个可以改变的变量放在里面
get age(){
if(this.$age==undefined){
this.$age = new Date().getFullYear()-2000;
}
return this.$age;
},//这个千万不要忘记添加上,因为里面定义的函数也是作为一个元素放在里面
set age(val){
val = +val;//这里面的+操作是为了变成数字,隐式转换
if(!isNaN(val)&&val>0&&val<150){
this.$age = +val;
}else{
throw new Error('Incorrect val' + val);
}
}
}
undefined
man.age
21
man.age = 100
100
man.age
100
man.age = 160
function foo(){}
undefined
Object.defineProperty(foo.prototype,)
VM8890:1 Uncaught TypeError: Property description must be an object: undefined
at Function.defineProperty (<anonymous>)
at <anonymous>:1:8
(anonymous) @ VM8890:1
Object.defineProperty(foo.prototype,'z',{get:function(){return 1;}});
{constructor: ƒ}
var obj = new foo();
undefined
obj.z = 1
1
obj.z = 10
10
obj.z
1
Object.defineProperty(obj,'z',{value:100,configurable:true});
foo {z: 100}
obj.z
100
delete obj.z
true
obj.z
1
//因为上面删除掉了原来的本身obj上的z所以只能向上寻找z
undefined
//另外有一个上面删掉的内容,就是create这个继承的东西
undefined
var o = {};
undefined
Object.defineProperty(o,'x',{value:1});
{x: 1}
var n = Object.create(o);
undefined
n.x
1
o.x = 100
100
o.x
1
//会发现上面依旧是1,是因为在默认情况下o里面的x是不可writeable的
undefined
//如果要改变这种状态可以先创建一个x,这样在原型链上的x就不会被先访问到
undefined
Object.cra
undefined
Object.defineProperty(n,'x',{value:1,writable:true});
{x: 1}
n.x = 100
100
n.x
100
//就可以更改了
get/set与原型链:
get set 方法 修改属性的不同
如果通过get/set方法设置和访问对象属性的时候,当通过obj.x方式添加属性的时候会先检查原型链上是否有get/set方法,如果有的话不会在对象上新创建一个属性,所以值设置不成功。
解决方法就是通过defineProperty设置属性
get/set方法例子
+val => 使得val转化为数字
这里的双等 使得如果没有定义 也是undefined 因为null==undefined(双等)
get:获取
set:设置
$age就是一个变量,不想在函数外部暴露这个属性
+val:将val变为数字
get, set设置属性与一般设置属性的区别,get、set不加冒号,而是空格分隔。
get/set与原型链
赋值、查询的时候会从原型链上赋值查找
赋值:obj是没有z属性的,往上查找,到foo函数的时候,有z的属性和foo函数对应的get/set方法,不会在obj对象上添加新的属性。
configurable//能否使用delete、能否需改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true.
definePropery x可以覆盖 writable=false的属性
object get 自己
get 与set 原型链方法
get 与set
getter和setter方法
11111111111111
要给obj对象赋值z,用Object.defineProperty方法,并可配置设为true
当obj偿试赋值z时,在原型链上查找时,发现原型有get或set方法时,当偿试赋值时,会走原型 的get和set|方法,不会在当前对象添加新属性的方式
在函数外访问age 不用$
$age,特殊的,不想暴露在外面
val=+val,用一元操作符,目的是变成数字(本身是数字时什么都不做)
get和set方法用逗号隔开
访问age时,会自动调用get 方法
修改writable和configurable:true实现当前对象可以赋值
为什么第二个obj.z还是1:?
实际上obj对象上没有z的属性并且向上查找时发现有get或者set的方法,当我们尝试去赋值时是会走原型链上的get、set方法,而不会再去通过给当前对象添加新属性的方式去处理。因此obj.z=10的赋值在这里是没有实现到的。
Object.defineProperty()
方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
isNaN是判断是否是非数字值
$age是一种特殊的key,是不想暴露age的value