通过“定制”su7,让你了解原型是什么原型的魅力在于“继承”,是通过“原型链”(__proto__)实现。当我们想从某个
在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的方法
面向对象编程中的原型
在面向对象的世界,原型就像是武侠小说里的内功心法,让你的代码能够轻松实现继承和扩展,创造出功能强大的对象家族。通过调整原型链,你可以模拟出类似类的继承体系,而且还能随时调整,增加继承的灵活性。但要小心,原型链太深可能会导致性能问题,就像家族谱太庞大,找起人来就费劲。
图解原型链
最后咱们来看一张图,如果说这张图你都已经没问题了,那么原型对你来说一定是小意思了。
-
f1
和Foo.prototype
:f1
作为一个函数,它通过__proto__
指向了Foo.prototype
,因为所有的函数都是Function
的后代。 -
f2
的情况与f1
相似。 -
o1
和o2
,作为普通对象,它们的__proto__
都指向了Object.prototype
,因为它们都是Object
的子孙。 -
Foo.prototype
和Function.prototype
之间也有条线,因为Foo.prototype
也是个对象,所以它也有自己的__proto__
,指向了Function.prototype
。 -
Object.prototype
的__proto__
指向null
,标志着原型链的终点。 -
最后,连函数的原型
Function.prototype
也要遵循规则,它的__proto__
指向了Object.prototype
,因为函数也是对象的一种。
结语
总而言之,原型和原型链是JavaScript中理解面向对象编程的关键。它们让代码变得既高效又灵活,就像是给你的程序穿上了一件可以随意变形的魔法斗篷。通过不断地实践和探索,你会发现更多关于原型的奥秘,让这些知识成为你编程旅途中的宝贵财富。记住,每行代码都是通往更深层次理解的阶梯,让我们一起,在JavaScript的宇宙中,勇敢前行吧!
转载自:https://juejin.cn/post/7377546788019945512