学习了JavaScript,觉得有必要对函数对象的prototype属性和普通对象的_proto_属性着重理解一下。
首先,万物皆对象。而对象又可分为函数对象和普通对象,当我们去用New Function()的时候,创建的就是函数对象。除开这种情况其他的都是普通对象,就如以下例子:
首先,万物皆对象。而对象又可分为函数对象和普通对象,当我们去用New Function()的时候,创建的就是函数对象。除开这种情况其他的都是普通对象,就如以下例子:
// 以下的三种情况创建的都是函数对象
var
f1
=
function
(
)
{
}
;
var
function
f2
(
)
{
}
;
var
f3
=
new
Function
(
'a'
,
'b'
)
;
// 以下的三种情况创建的都是普通对象
var
o1
=
{
}
;
var
o2
=
new
f3
(
)
;
var
o3
=
new
Object
(
)
;
其中f1,f2归根结底还是用New Founction去创建的,所以是函数对象。
对于函数对象才有prototype属性,这个属性就是原型对象,这个原型对象其实就是一个普通对象(Function.prototyp除外),它没有prototype属性
从以上第二行代码可以看出,f1.prototype就是f1的一个实例对象 。就是在创建f1的时候,创建了他的一个实例对象并赋值给他的prototype属性,如下:
那么,这个属性有什么作用呢?继承作用,相当于将函数对象的公有属性放在prototype中,那么函数对象的实例会共享这些属性。
再说说_proto_属性,这个属性指向的是创建这个对象的函数对象的prototype属性,一层一层的对象继承就是以prototype为实体_proto_为连接纽带实现的。把这个有_proto_串起来的直到Object.prototype._proto_为null的链叫做原型链。
总结
1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成真正是靠_proto_而非prototype
对于函数对象才有prototype属性,这个属性就是原型对象,这个原型对象其实就是一个普通对象(Function.prototyp除外),它没有prototype属性
function
f1
(
)
{
}
;
console
.
log
(
f1
.
prototype
)
//f1{}
console
.
log
(
typeof
f1
.
prototype
)
//Object
var
te
=
new
Function
(
)
;
Function
.
prototype
=
te
;
var
function
f1
(
name
)
{
this
.
name
;
}
f1
.
prototype
.
getName
=
function
(
)
{
return
this
.
name
;
}
var
hty
=
new
f1
(
'hutianyi'
)
;
hty
.
getName
(
)
;
//hutianyi
总结
1.原型和原型链是JS实现继承的一种模型。
2.原型链的形成真正是靠_proto_而非prototype