obj.proto 隐式原型,所有对象都有,是一个普通对象,有的浏览器也显示为[[Prototype]]
function Product(pname,price){
this.pname =pname //this代表当前创造出来的Object
this.price=price
this.show = function(){
console.log('品名',this.pname,'价格',this.price)
}
}
let p1 = new Product('华为',4000) //创建对象(实例化对象)p1 同时p1也叫Product的实例
let p2 = new Product('小米',3000) //创建对象(实例化对象)p2 p1和p2不是同一个对象!
p1.show() //p1.show()与p2.show()也不是同一个 当前show的this指向p1
p2.show() //当前show的this指向p2
console.log(p1.__proto__==Product.prototype)
console.log(p2.__proto__==Product.prototype)
Product有__proto__、prototype
Product.__proto__指向Function.prototype Function.__proto__指向Object Object.__proto__指向Object.prototype Object.prototype.__proto__指向null
prototype指向Productprototype
p1有pname、price、show 、__proto__
p1.__proto__指向Product.prototype Product.prototype.__proto__指向Object.prototype
Object.prototype.__proto__指向null
Object.prototype 显式原型,所有函数(包括构造函数)都有,并且只存在于构造函数,是一个普通对象
数组的方法保存于Array.prototype上
obj.proto == obj的构造函数.prototype (obj为普通对象,也叫实例对象,它由obj的构造函数所实例化出来的)
因此,只要在构造函数的prototype上添加了属性或方法,由该构造函数实例化出来的对象都能使用该属性或方法
对象只有.proto
所有函数有.prototype与.proto,(函数本质也是对象)
Function 没有.prototype
所有对象的.__proto__或者构造函数的.prototype一定指向Object.prototype
对象属性查找的顺序
如果第6行代码被注释,在构造函数上虽然定义了属性pname的属性值为‘小米’,但第七行在实例对象的.__proto__又重新定义了pname,覆盖了构造函数原型对象上的pname属性值,因此输出
obj.hasOwnproperty(propertyName)
检测propertyName是否为对象obj的自身属性(静态属性),不会在原型链内查找属性,返回布尔值
var obj = {
name : '张三'
children:{
Cname:'李四'
}
}
console.log(obj hasOwnProperty('name ')) //true
console.log(obj hasOwnProperty('children')) //true
console.log(obj hasOwnProperty('Cname ')) //false
hasOwnProperty 判断是否有自身属性(包括不可遍历属性、不包括原型链上的属性),返回布尔值
let obj = {
age:18
}
Object.defineProperty(obj,'name',{
enumerable:false,
value:'111'
})
console.log(obj.hasOwnProperty('name')); //true
obj.getOwnPropertyDescriptor(obj,obj属性名)返回obj属性的描述信息(特性:是否可枚举、删除等等)
Key in obj
只要属性在原型链上,结果都返回 true
判断对象某个属性是否存在
obj.属性名 == undefined
最不靠谱的一种方法 ,如果属性属性值为undefined,等式成立
Object.keys(obj).includes('属性名')
Object.keys(obj)只能判断obj的自身可枚举属性,能for in 得到的属性都能进行判定
obj.hasOwnProperty('属性名')
能判定obj自身属性(静态属性)与不可枚举属性,但不能判断实例属性
'属性名' in obj
无论是否是实例属性还是静态属性,无论是可枚举还是不可枚举,都能判断