likes
comments
collection
share

通过“定制”su7,让你了解原型是什么原型的魅力在于“继承”,是通过“原型链”(__proto__)实现。当我们想从某个

作者站长头像
站长
· 阅读数 16

在JavaScript这片神奇的土地上,有一个叫做“原型”的概念,它就像是每个函数的魔法背包,藏着能让所有后代共享的秘密武器。今天,我们就来一场说走就走的旅行,探索这个充满魔力的原型世界,看看它是如何让我们的代码变得既强大又灵活。

原型:共享的智慧宝库

最近su7不是比较火嘛,假如你突然想买一辆su7回家,但是你不想要市面上的样式,要去定制一辆专属于你的su7,咱们来看看用代码如何实现。

function Car(color,owner) { 
    this.name = 'su7'
    this.lang = 5000
    this.height = 1400
    this.color = color
    this.owner = owner
}
let car1 = new Car('green','tian')

想象一下,咱们可以看到,像车品牌和车身尺寸这些固定的东西每次生产都要重新执行一遍,很耗费时间对吧。但在JavaScript里,你可以通过原型(prototype)来解决这个问题。每个函数天生自带一个叫prototype的属性,它是个对象,里面装着所有通过这个函数构造出来的对象都能共享的属性和方法。那么咱们可以优化一下代码。

Car.prototype.name = 'su7'
Car.prototype.lang = 5000
Car.prototype.height = 1400

function Car(color,owner) { 
    this.color = color
    this.owner = owner
}
let car1 = new Car('green','tian')

这样就可以在生产过程中避免重复的生产步骤,节省时间成本。代码也是如此,可以减少运行时间。

原型链:家族的传承之路

原型的魅力在于“继承”,是通过“原型链”(proto)实现。当我们想从某个对象访问一个属性或方法时,如果它自己没带,JavaScript就会沿着__proto__这条线去问它的“祖先”。这就像你问妈妈问题,妈妈不知道就问外婆,一直问到家族里最年长的长辈,或者最终没人知道答案(那时__proto__指向null,表示终点)。

let car1 = new Car('green', '小明');

就好比你买了一辆好车,但是开回村里没人知道这是什么牌子的,但是车子本身帅啊,就会被人问起多少钱,是啥牌子的。car1想知道自己有没有导航系统,虽然它本身没安装,但只要Car.prototype上有,它就能通过原型链找到。

隐式与显式:看不见的手与明灯

  • 隐式原型( __ proto __):每个对象都有这么个隐形的指针,指向创建它的构造函数的prototype。这意味着,每个孩子都能间接接触到家族的共有财产。

  • 显示原型(prototype):构造函数的明灯,照亮孩子们的道路。修改构造函数的prototype,就等于给所有后代都发了新玩具。

特例:Object.create()与孤儿

有时候,你想创造一个特别的孩子,他不想要家族的任何遗产。这时,Object.create()登场了,它能直接创建一个对象,并指定这个对象的__proto__指向谁。

let a = { num1: 1 };
let b = Object.create(a); // b 直接继承自 a
console.log(b.num1); // 输出 1

let c = Object.create(null); // c 是个孤儿,没有原型
console.log(c.toString); // undefined,因为c没有继承Object的方法

面向对象编程中的原型

在面向对象的世界,原型就像是武侠小说里的内功心法,让你的代码能够轻松实现继承和扩展,创造出功能强大的对象家族。通过调整原型链,你可以模拟出类似类的继承体系,而且还能随时调整,增加继承的灵活性。但要小心,原型链太深可能会导致性能问题,就像家族谱太庞大,找起人来就费劲。

图解原型链

最后咱们来看一张图,如果说这张图你都已经没问题了,那么原型对你来说一定是小意思了。

通过“定制”su7,让你了解原型是什么原型的魅力在于“继承”,是通过“原型链”(__proto__)实现。当我们想从某个

  • f1Foo.prototypef1作为一个函数,它通过__proto__指向了Foo.prototype,因为所有的函数都是Function的后代。

  • f2的情况与f1相似。

  • o1o2,作为普通对象,它们的__proto__都指向了Object.prototype,因为它们都是Object的子孙。

  • Foo.prototypeFunction.prototype之间也有条线,因为Foo.prototype也是个对象,所以它也有自己的__proto__,指向了Function.prototype

  • Object.prototype__proto__指向null,标志着原型链的终点。

  • 最后,连函数的原型Function.prototype也要遵循规则,它的__proto__指向了Object.prototype,因为函数也是对象的一种。

结语

总而言之,原型和原型链是JavaScript中理解面向对象编程的关键。它们让代码变得既高效又灵活,就像是给你的程序穿上了一件可以随意变形的魔法斗篷。通过不断地实践和探索,你会发现更多关于原型的奥秘,让这些知识成为你编程旅途中的宝贵财富。记住,每行代码都是通往更深层次理解的阶梯,让我们一起,在JavaScript的宇宙中,勇敢前行吧!

转载自:https://juejin.cn/post/7377546788019945512
评论
请登录