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(){
}
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