使用class声明对原型的影响

在ES5中,更改Animal类的原型会影响到之后实例化的对象

function Animal () {}
var a1 = new Animal()

Animal.prototype = {sayhi(){}}
var a2 = new Animal()

console.log('1 -- '+ a1.sayhi)  // undefined
console.log('2 -- '+ a2.sayhi)  // function sayhi(){}

因为Animal的prototype属性writable。

Object.getOwnPropertyDescriptor(Animal, 'prototype')
/*
{
  configurable: false
  enumerable: false
  value: Object { sayhi: sayhi() }
  writable: true
​}
*/

在ES6中,使用class创建的类,修改其原型不会影响后面实例化的对象

class Person {}
var p1 = new Person()
Person.prototype = {sayhi(){}}
var p2 = new Person()
console.log('1 -- '+ p1.sayhi) // undefined
console.log('2 -- '+ p2.sayhi) // undefined

因为Person 的prototype属性是unwritable。

Object.getOwnPropertyDescriptor(Person, 'prototype')
/*
{
  configurable: false
  enumerable: false
  value: Object { ... }
  writable: false
​}
*/

你可能感兴趣的:(使用class声明对原型的影响)