一面向对象的设计之对象属性

1.对象属性

let person = {};
Object.defineProperty(person, "name", {
configurable: true, //表示能否通过delete删除属性从而重新定义属性,能否修改属性
enumerable: true, //表示能否通过for-in循环返回属性
writable: true, // 表示是否能修改属性的值
value: "xujiang" // 属性的值
})
/* 在调用Object.defineProperty()方法创建一个新属性时,如不指定前三个属性字段,默认值都为false, 如果是修改已定义的属性时,则没有此限制 */

// 2.访问器属性get/set
let person = {name: "xujaijgn", year: 11};
Object.defineProperty(person, "_name", {
get: function(){
return this.name
},
// 定义Set时,则设置一个属性的值时会导致其他属性发生变化
set: function(newValue){
this.name = newValue;
this.year = 12;
}
})

// 定义多个属性
Object。defineProperties(book, {
_year: {
writable: false,
value: 2001
},
year: {
get: function(){
return _year
},
set: function(newValue){
this._year = newValue;
}
}
})

2.判断属性是否存在对象中 in hasOwnProperty

in 是判断属性是否存在对象中

hasOwnProperty判断属性是否存在实例中

delete删除对象中属性 

例子:

function Person(){

扫描二维码关注公众号,回复: 10152641 查看本文章

}

Person.protype.name='王菲';

var person=new Person();

console.log(person.name)//王菲

console.log(name in person )//true

console.log(person.hasOwnProperty('name')) //false

person.name='大牛';

console.log(person.hasOwnProperty('name')) //true;

3.彻底搞懂JS中的prototype、__proto__与constructor 

new 操作符 函数被调用,然后新创建一个对象,并且成了函数的上下文(也就是此时函数内部的this是指向该新创建的对象,这意味着我们可以在构造器函数内部通过this参数初始化值),最后返回该新对象的引用

 __proto__ 属性,它是对象所独有的,可以看到__proto__属性都是由一个对象指向一个对象,即指向它们的原型对象(也可以理解为父对象)

prototype 属性 它的作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数所实例化的对象们都可以找到公用的属性和方法。

constructor 属性也是对象才拥有的,它是从一个对象指向一个函数,含义就是指向该对象的构造函数,每个对象都有构造函数(本身拥有或继承而来,继承而来的要结合__proto__属性查看会更清楚点,如下图所示)

4.原型链

var Foo=function(){} var foo=new foo();

foo.__proto__===Foo.prototype

Foo.prototype.__proto__===Object.protype;

Object.protype.__proto__===null;

引用博客地址:

https://blog.csdn.net/cc18868876837/article/details/81211729

http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html

https://juejin.im/post/5d8c86d06fb9a04e172071a0

猜你喜欢

转载自www.cnblogs.com/wayOfHero/p/12565774.html