Sub.prototype = Object.create(Vue.prototype) 和 Sub = Object.create(Vue) 的差异理解
Sub.prototype = Object.create(Vue.prototype) 和 Sub = Object.create(Vue) 的差异理解
浮川的小窝

Sub.prototype = Object.create(Vue.prototype) 和 Sub = Object.create(Vue) 的差异理解

面壁人浮川
2022-09-01 发布 / 正在检测是否收录...

cb8fc857d4abafd5038cb7b2c0233d6e.jpg

不完全相同。

Sub.prototype = Object.create(Vue.prototype) 是将 Sub 函数的原型对象设置为一个从 Vue.prototype 对象继承而来的新对象。这意味着 Sub.prototype 对象继承了 Vue.prototype 对象的所有属性和方法,并且任何通过 new Sub() 创建的实例都将继承这些属性和方法。

而 Sub = Object.create(Vue) 是将 Sub 对象本身设置为一个从 Vue 对象继承而来的新对象。这意味着 Sub 对象继承了 Vue 对象的所有属性和方法,但是 Sub.prototype 对象仍然是一个空对象,任何通过 new Sub() 创建的实例将不会继承任何 Sub.prototype 对象中的属性和方法。

通常在创建一个自定义类时,我们会使用 Sub.prototype = Object.create(Super.prototype) 来设置子类的原型对象,以便继承父类的方法。而使用 Sub = Object.create(Super) 则更适合创建一个新的对象来扩展现有对象的功能,而不是创建一个新的类。


下面是针对cerate的验证过程 可能有些絮叨(旺柴)

function Vue() {
this.name = 'vue'
this.age = 18

this.getName = function () {

console.log(`名字${this.name}`)

}
this.getAge = function () {

console.log(`年龄${this.age}`)

}
}

Vue.prototype.getProtoName = function () {
console.log(prototype名字${this.name})
}
Vue.prototype.getProtoAge = function () {
console.log(prototype年龄${this.name})
}

function Sub() {}

// 让Sub构造函数中的prototype等于Vue.prototype
/**

  • 让Sub构造函数中的prototype等于Vue.prototype
  • 等同于Sub.prototype.__proto__ = Vue.prototype
  • 因为之前纠结于sub.__propo__ = Sub.prototype
  • 实例对象的__proto__指向构造函数的prototype 所以误认为
  • sub.prototype == Sub.__proto__等式也成立
  • 此段代码的意义是实现构造函数Sub所声明的所有实例对象 可以通过
  • __proto__属性访问到Vue.prototype中的属性和方法
  • 因为sub.__proto__ = Sub.prototype 所以sub.__proto__.__proto__ = Vue.prototype
  • 隐式原型链__proto__的作用就是当一个当前对象中没有的属性或方法时
  • 通过__proto__属性去当前对象的隐式原型链中查找
  • sub.__proto__指向了构造函数Sub的prototype原型值
  • 又因为Object.create所创建的对象的隐式原型链指向了第一个参数对象
  • 等同于Sub.prototype = Object.create[这个新创建的对象拥有Vue上所有的属性和方法]
  • 注:不包含构造函数中的属性和方法 如果想要继承构造函数中的属性和方法
  • 需要使用call或apply方法将构造函数中的属性和方法绑定到新创建的对象上
  • 例如:function Sub(name,age) {
  • Vue.call(this,name,age)
  • }
  • 等同于sub.__proto__= Sub.prototype = Vue.prototype
  • sub.__proto__.__proto__ = Sub.prototype.__proto__ = Vue.prototype
    */

Sub.prototype = Object.create(Vue.prototype, {
constructor: {

value: Sub,

},
})
const sub = new Sub()

© 版权声明
THE END
喜欢就支持一下吧
点赞 0 分享 收藏

评论 (0)

取消