JS 原型方法

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
		无论是否是实例属性还是静态属性,无论是可枚举还是不可枚举,都能判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值