1.原型是 function对象的一个属性,是构造函数构造出对象的公有祖先,而原型本身也是一个对象。
2.从原型的概念出发,我们可以用构造函数构造出的对象提取原型上的属性。
3.因为原型也是一个对象,所以原型本身对自己的属性有增删改查的权利。
4.对象如何知道自己的原型是谁,可以通过对象中的_ proto_ 属性查看,_ proto_ 属性存的就是对象的原型,他是作为对象与原型之间的连接。
5.构造函数构造的对象如何查看是谁构造出自己的,可以通过constructor属性
首先从原型的定义开始解释:
原型是function对象的一个属性,这句话如何理解?
1.function函数其实就是一个对象,当你构造出一个函数时,这个函数对象就有了自己隐式的属性,prototype就是其中的一个属性。
那么先构造出一个函数,在控制台查看,函数对象是否有prototype,并且prototype是否也是一个对象。
我们在控制台中给father的prototype属性添加name属性并赋值,看看是否有效?
给prototype添加属性后,并可以输出name的值。那么也是可以给prototype添加方法的。
给prototype添加say方法实现输出自己的name,执行say(),的确输出了'haha'
2.我们如何理解,prototype是构造函数构造出对象的公有祖先?
首先当构造出函数时prototype就成为了这个函数的属性,并且prototype也可以添加属性和方法,而构造函数构造出的对象能继承构造函数中的方法,且这个对象自身也能添加属性和方法?
那么问题来了?
当我查看对象的name属性时,对象并没有这个属性,那他就会自动去构造出自己的函数中去找是否有这个属性,那当构造函数也没这个属性时,他就会去自己的原型上查找是否有这个属性,如果原型上存在name属性,对象就会获取到这个属性并输出。
而这个获取到原型属性的过程,其实就是一种继承的方式。
举例:
1.prototype是function对象的一个属性;
2.prototype是构造函数构造出对象的公有祖先;
3.prototype也是一个对象。
从总结的第三点可以知道,prototype可以拥有自己的属性和方法,并有权进行增删改查,那么接下来展示prototype如何进行增删改查。
对Mom的prototype属性进行操作。
增:
给出你想要添加的属性,并赋值。
删:
delete
所以prototype对象的增删改查和普通对象的用法相同。
这里还需注意,prototype上的属性只能由自身操作,对象从prototype上获取到的属性进行操作后,并不会影响到prototype。
接下来解释对象的_ proto_ 属性(前后分别是两个_)
_ proto_ 属性里存的是对象的prototype
举例:
接下来解释constructor属性:
对象可以通过该属性查看构造出自己的函数
总结:
prototype是function对象的一个属性,是构造函数构造出的对象的公有祖先,他本身也是一个对象,所以他可以有自己的属性和方法,并对其进行增删改查的操作,对象没有权利修改prototype上的属性和方法。对象可以通过自己的_ proto_ 查看他的prototype,通过constructor查看构造出自己的函数。
js是一个兄妹俩的组合和she、动力火车是同一个公司的
1999年,千禧年前夕,当时华语乐坛还一片兴盛气息,新人辈出百花齐放,有一对身高高人一等的兄妹-陈忠义与陈绮萱,挟着“MTV新声卡位战”创作组第一名的荣耀,以“GoGo&MeMe”为团名,推出了第一张专辑《Say Forever》。一首专辑同名曲《Say Forever》传唱至今,每年圣诞节更成为电台的必播曲--“我一个人不孤单/想念的人才孤单…”,清新的嗓音动人的旋律在在令人回味不已,只是,这对兄妹发完这张专辑之后,到哪里去了?
他们与当时所属的唱片公司人事改组。回到台湾之后,第二张专辑的发片遥遥无期,公司的其它艺人陆续发片,却好象没有人再想到他们。直到他们死心不想再等,鼓起勇气向公司提出提早解约换取自由身的要求。之后哥哥陈忠义进入师大美术研究所攻读硕士(今年已毕业),并且埋首努力创作,间或接一些电玩配乐或广告配乐的案子;妹妹陈绮萱一样努力于世新广电的学业,并且担任哥哥的DEMO歌手,哥哥接的电玩案子广告案子,妹妹也帮忙演唱以及担任配音员,并且也接一些老师同学的影片后期的CASE。
那段孤绝地日子里,他们以为事情就这样了,原本忠义打算从此走入幕后,等研究所毕业后一边担任大学讲师一边写歌,而绮萱也准备朝往影片制作的路线走去。一切直到华研唱片听到忠义的创作《也许有一天》,当时正在收动力火车的歌的华研制作部,收到这首DEMO之后,惊艳于忠义作品的突飞猛进,之后再向他们邀歌,又收到《镇守爱情》……他们的音乐故事从此又转了个弯,华研欣赏他们的丰沛创作与演唱实力,他们也愿意把自己交给这家拥有动力火车与S.H.E两种不同风格的组合的公司,从GoGo&MeMe改名为JS。
其实简单来说,原型就是一个对象对另一个对象的引用。
然后其是怎么联系起来的呢,是通过prototype。对就是这个,给你一个例子
var obj = {a: 2
}
var myObj = Object.create(obj)
console.log(myObj.a) // 2
console.log(myObj === obj) // false
console.log(Object.getPrototypeOf(myObj) === obj) // true
Object.getPrototypeOf(myObj).a = 4
console.log(obj.a) // 4
通过上面的例子,你可以看到,myObj的原型就是obj!然后obj的原型是哪个呢,是Object.prototype。实际上通过上面,你就能知道,原型原理上是对于另一个对象的引用,通过引用吧几个对象给串联起来调用。
那么你的第二个问题马上又来了,可能也是你关心的问题,类和原型的关系是啥呢?
实际上,类在实例化的时候,也就是通过new来创建一个对象的时候,是分为以下几步的:
创建一个全新的对象
这个新对象会被执行prototype连接
新对象绑定到函数调用的this
如果函数没有返回其他对象,那么new表达式中的函数调用会自动返回这个新对象
这个就是new实例化的时候,所做的一些步骤,那么你其中有几个需要注意的点:
如果有return并且返回的是一个对象的话,则直接返回return后的那个对象。
反之,则新建一个对象。
并且吧函数的prototype引用到新建对象的prototype中。
这个怎么理解呢?再给你一个例子,可能例子更直观一些:
var protoObj = {b: 10
}
function Foo() {}
Foo.prototype = protoObj
var a = new Foo()
console.log(Object.getPrototypeOf(a) === Foo.prototype) // true
console.log(Object.getPrototypeOf(a) === protoObj) // true
console.log(a.b) // 10
通过这个例子,你可以看出来,实际上类实例化的过程,其中有一项,就是把其构造好的对象的prototype和类的prototype做关联。因为做好了引用关联,所以构造好的对象可以使用原类里面的原型方法。
这个也讲完了,那么你可能会对class比较感兴趣,想知道class是怎么做的,实际上,class更多,我理解上就是上面类似于Foo()类的一种语法糖,当然也不仅仅是语法糖,但是大体原理是没啥区别的,所以,上面所说的,对于class也同样适用
好啦,如果你对原型和类实例化有更多想了解的,可以给你两篇文章,参考一下:
Javascript基础之-原型(prototype)
Javascript基础之-this