/**
* 说一下我理解的prototype和__proto__
* prototype是原型对象上给实例对象提供的共有方法,而函数里面this那些都是原型对象给实例对象提供的私有方法
*function fun(){
this.str='我是一段字符串'
this.f=function(){
console.log(this.str)
}
}
fun.prototype.f=function(){
console.log('我是原型链上绑定的方法')
}
const func=new fun()
const func1=new fun()
console.log(typeof func)//'object'
console.log(typeof func1)//'object'
console.log(func.__proto__===fun.prototype)//true
console.log(func.f===func1.f)//false
func.f===func1.f//false,因为每次创建新的实例对象都是独立的,就在堆内存中重新开辟一块空间,所以原型对象上面创建的this都是属于私有的
console.log(func.f===func1.f)//true,因为typeproto是原型对象给实例对象创建的共有方法,所以是相等的
那在解释一下万物皆对象 我的理解
Object作为原型对象来讲的话,这句话怎么理解呢,因为Object.prototype为所有的实例提供了共有的方法,例如
valueOf
toString
hasOwnProperty
...
为什么string,function,number,boolean,array,object都可以使用Object.prototype上面的方法,不是说只有是Object实例才可以使用它的方法嘛
javascript 中面向对象也是层层向上找,先是私有方法找如果找到则使用私有方法如果找不到则通过原型链(.__proto__)一级一级往上找直到null
所以 let num=5 先是 Number原型对象的实例也是Object的实例,num.__proto__.__proto__ ===Object.prototype
那在说说为什么Object.__proto__=Function.prototype因为Object作为原型对象他是函数,除了函数才会有prototype这个属性
在解释一下num instanceof Object// false 因为 我们日常创建的let num=5,let str='我是一段字符串';
字符串字面量 (通过单引号或双引号定义) 和 直接调用 String 方法(没有通过 new 生成字符串对象实例)的字符串都是基本字符串。
JavaScript会自动将基本字符串转换为字符串对象,只有将基本字符串转化为字符串对象之后才可以使用字符串对象的方法。
当基本字符串需要调用一个字符串对象才有的方法或者查询值的时候(基本字符串是没有这些方法的),
JavaScript 会自动将基本字符串转化为字符串对象并且调用相应的方法或者执行查询。
上面都是MDN文档解释 ,也就是并不是new String()出来的
instanceof 判断的也是 一个对象的__proto__在不在那个prototype上面
typeof str //'string'
typeof (new String('我是字符串')) //object
那怎么判断呢
str instanceof String
str.constructor==String
constructor是找到它的原始对象
再说说 Object.create()
let obj=Object.create(func.prototype)
则就是 obj.__proto指向了func.prototype
*/
Javascript中的__proto__和prototype
最新推荐文章于 2023-02-16 16:24:47 发布