什么是原型 .什么是原型链?
- 原型:对象上的内置属性[[prototype]]
- 原型链:在对象上访问某个属性,如果对象本身没有就继续在它的[[prototype]] 上找 ,如果找不到继续在 [[prototype]]的[[prototype]]上找.....直到 Object.prototype
传统面向类语言的实例化
类实例化就意味着把类的行为复制到物理对象.
js中的实例化
在js中并没有真正类的概念,实例对象 是通过构造函数调用的.它并没有生成一个完全独立的实例对象.所有的实例都会有原型联系。
function Fn(){}
let f1 = new Fn();
let f2 = new Fn();
上面通过函数的new调用,实际上只是生成了两个[[prototype]]都指向Fn.prototype 的实例
原型的作用
在js设计中.原型的主要作用是实现对象的相互关联..
相关方法
- Object.getPrototypeOf 获取对象的[[prototype]]
function Fn(){}
let f1 = new Fn();
console.log(Object.getPrototypeOf(f1) == Fn.prototype)//true
- Object.create(obj) 创建并返回一个新的对象,使用现有对象 给新对象提供[[prototype]]
let obj ={
name:'obj',
say(){
console.log(this.name)
}
}
let new_obj = Object.create(obj)
console.log(new_obj.__proto__ === obj)
- obj instanceof Fn 运算符用来检查 函数的prototype是否出现在对象的整条原型链上
let Fn =function(){}
let f = new Fn();
let Mo = function(){}
console.log(f instanceof Fn) //true
console.log(f instanceof Mo) //false
-
普通对象的实例:只有__proto _
-
所有(非主机外)的原型链最终都会指向Object.prototype
____proto____、prototype、constructor的关系
- 实例对象的 _proto _ 指向他的构造函数的prototype原型对象。
- prototype原型对象的constructor指向构造函数本身
- 构造函数的prototype的_ proto_指向他的构造函数的prototype
- 最终会指向Object.prototype (Object.prototype._ proto _指向null)
function Person(){}
let person = new Person()
console.log( person.__proto__ === Person.prototype) //true
console.log(Person.prototype.constructor)//Person
console.log(Person.__proto__ === Function.prototype) //true
console.log(Object.prototype.__proto__)//null
console.log(Function.prototype.__proto__ == Object.prototype)
//true 最终会指向Object.prototype
原型链
- 如果在一个对象上找某个属性,如果它本身没有 就去它的proto去找。如果它的构造函数的原型对象没有。那就去它构造函数的原型对象的proto去找,一直找到Object.prototype为止.返回undefined
function Person() {
this.name = '李明';
this.say = function () {
console.log('说话')
}
}
Person.prototype.doSomeThing = function(){
console.log('做事情')
}
Object.prototype.eat = function () {
console.log('吃东西')
}
Function.prototype.sport= function () {
console.log('做运动')
}
let person = new Person()
person.doSomeThing()//做事情
person.eat()//吃东西
person.sport()//报错。sport is not a function
Person.sport()//做运动
//查找过程 person 本身没有 doSomeThing .然后去Person 的原型对象去找。找到了。
//person本身没有eat 去他的构造函数的原型上找。没找到。然后去
Person.prototype.__proto__找 。也就是Object的prototype找。找到了。
网友评论