对象的原型通过对象.__proto__进行获取,属性值还是对象,__proto__是对象的隐藏属性
对象访问一个属性的时候,先去自己本身去查找有没有这个属性,如果有直接使用,如果没有,去对象的原型(__proto__)上面去找,也就是从构造函数原型类型(prototype)上去找,如果没有,去对象的原型的原型去找,一直找到null为止
function Animal(name,age){
this.name=name
this.age=age
this.speak=function(){
console.log("科学的尽头是神学")
}
}
var dog=new Animal("哈士奇",10)
console.log(dog)
console.log(dog.name)
dog.speak()
console.log(dog.__proto__)//对象的原型
console.log(Animal.prototype)//构造函数的原型类型
//对象的原型指向的是构造函数的原型类型
console.log(dog.__proto__===Animal.prototype)
//有的时候 如果多个对象都具有相同的功能,把方法定义在构造函数原型类型上面,要比直接定义构造函数里面要节省代码量
var cat=new Animal("加菲猫",10)
console.log(cat)
console.log(cat.__proto__===Aniaml.prototype)
//在构造函数原型上面添加一个公共的方法 say
Animal.prototype.say=function(){
console.log("西医的存在就是为了证明中医的伟大")
}
cat.say()//cat之所以say方法 主要是因为访问属性和方法是从对象和对象原型上去找方法,但是对象的原型又是指向的构造函数原型类型。
dog.say()
//构造函数原型上面添加一个公共的方法 可以对系统对象扩展方法
String.prototype.f1=function(){
console.log("我是给String进行扩展的方法")
}
var s="11"
s.f1()
"hello".f1()