一、对象属性设置--defineProperty
1.Object.getOwnPropertyDescriptor()
var Person={
name:"zs"
}
var des=Object.getOwnPropertyDescriptor(Person,"name")
console.log(des.value); //zs
console.log(des.configurable); //true
console.log(des.writable); //true
console.log(des.enumerable); //true
2.对象的数据属性
value 属性的属性值
configurable 能否删除属性的值
writable 能否修改属性的值
enumerable 能否遍历(枚举)属性的值
// var Person={}
// Object.defineProperty(Person,"name",{value:"zs",writable:false})
// console.log(Person.name); //zs
// Person.name="ls"
// console.log(Person.name); //zs
var Person={}
Object.defineProperty(Person,"name",{value:"zs",writable:true,enumerable:true})
Object.defineProperty(Person,"age",{value:"23",enumerable:true})
// Object.defineProperty(Person,"age",{value:"23",enumerable:flase})
var v1=Object.keys(Person)
console.log(v1); //[ "name", "age" ]
3.对象的访问属性
get:在读取属性时调用的函数
set:再写入属性时调用的函数
二、继承
1.约定
function Person(){
var name="zs"//私有的基本属性
var friends=["ls","ww"]//私有的引用属性
function f1() {} //私有的函数
}
function Person(){
this.name="zs"//实例的基本属性
this.friends=["ls","ww"]//实例的引用属性
this.f1=function f1() {} //实例的函数
}
function Person(){}
Person.prototype.name="zs"//原型的基本属性
Person.prototype.friends=["ls","ww"]//原型的引用属性
Person.prototype.f1=function f1() {} //原型的函数
2.原型链继承
创建一个对象,Animal,构造函数+原型的函数
name,引用类型 方法say eat
核心:Cat.prototype=new Animal()
拿父类实例化充当子类原对象
原型链查找顺序:先在实例内查找,再找实例对象原型,再找父类构造函数,再找父类圆形
优点:简单易于实现
缺点:原型的引用类型属性是所有实列共享的
创建子实例时无法向父类构造函数传参
3.原型链原理
function Animal(){}
Animal.prototype.name="animal"
Animal.prototype.say=function(){console.log("hello")}
console.log(Animal)//animal
console.log(typeof Animal.prototype)//object
console.log(Animal.prototype.constructor)//animal
(1)每个函数都有一个显示的"prototype"属性,该属性指向原型对象
(2)原型对象中的"constructor"属性,指向函数本身