js原型的理解

114 阅读2分钟

js原型对象

题外话:使用new创建实例发生的五件事

  • 在内存中创建一个新对象
  • 这个新对象内部的[[Prototype]]特性被赋值为构造函数的prototype属性
  • 构造函数内部的this被赋值为这个新对象。(this指向这个新对象)
  • 执行构造函数内部的代码(给对象添加属性)
  • 如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。

原型的理解

只要创建一个函数,就会按照特定规则为这个函数创建一个prototype属性,这个属性指向原型对象。默认情况下,所有原型对象会自动获得一个名为 constructor 的属性指回与之关联的构造函数。然后,因构造函数的不同,可能会给原型对象添加其他属性与方法。

构造函数、实例、原型对象的关系

构造函数、实例、原型对象是3个完全不同的对象。

  • 实例的[[Prototype]]特性指向原型对象([[Prototype]]就是chrome浏览器中的__proto__)
  • 构造函数的prototype属性指向原型对象
  • 实例与原型对象有直接联系 实力与构造函数无直接联系

1.jpg

一些有关原型对象的方法

  • isPrototypeOf() 该方法会在传入参数的[[Prototype]]指向调用它的对象是返回true
    console.log(Person.prototype.isPrototypeOf(person1))//true
    console.log(Person.prototype.isPrototypeOf(person2))//true
    //person1和person2是Person new的实例
  • Object.getPrototypeOf() 返回参数的内部特行[[Prototype]]的值
    console.log(Object.getPrototypeOf(person1) == Person.prototype)//true
  • Objct.setPrototypeOf() 可以向实例的私有特性[[Prototype]]写入一个新值 (基本不用)

原型的层级

当原型下属性或者方法的名字 与 实例下的方法或实例的名字相同。则原型下的该属性与方法将会被隐藏

可以通过hasOwnProperty()和查看该属性是在实例还是在原型上。当在实例上则返回ture 否则返回false

function Person(){}
Person.prototype.name = 'zs'
let person = new Person()
console.log(person.hasOwnProperty('name')) //false
person.age = 18
console.log(person.hasOwnProperty('age')) //true

in操作符会在可以通过对象访问指定属性是返回true

Object.keys()方法接受一个对象作为参数 返回包含该对象所有可枚举属性名称的字符串数组

Object.values()方法接受一个对象作为参数 返回对象值的数组

Object.entries()方法接受一个对象作为参数 返回键/值对的数组

组合继承基本思路

使用原型链继承原型上的方法和属性,而通过盗用构造函数继承实例属性。


function SuperType(name){
    this.name = name ;
    this,colors = ['red','blue','green'];
}

SuperType.prototype.sayName = function(){
    console.log(this.name)
}

function SubType(name,age){
    //继承属性
    SuperType.call(this,name);
    this.age = age;
}
//继承方法
SubType.prototype.sayAge = function(){
    console.log(this.age)
}

还有原型式继承、寄生式继承、寄生式组合继承等等