var a = {
test : function () {
}
}
function b() { // b 构造函数
this.j=3;
}
var t = new b(); //T实例
b.prototype ; // b 的原型对象
b.__proto__; //?有没有这种写法
t.__proto__; //?有没有这种写法
t.prototype; //?有没有这种写法
a.prototype; //?有没有这种写法
a.__proto__; //?有没有这种写法
想问一下什么时候用prototype 然后b.__proto__; //?有没有这种写法
t.__proto__; //?有没有这种写法
t.prototype; //?有没有这种写法
a.prototype; //?有没有这种写法
a.__proto__; //?有没有这种写法
初始状态只有函数有prototype.
实例的__proto__指向其构造函数的prototype.
函数也有__proto__因为函数是Function函数构造函数的实例。
除去自行添加的情况。。。。
所有对象(除了非常特殊的一个,可不考虑)都有
__proto__
属性,只有函数才具有prototype
属性。所以只有
t.prototype
和a.prototype
是没有的。其他都是有的。这样的代码,可以看作是
b
是类,t
是b
类的一个实例。比如
这样
obj
是Object
类的一个实例。在面向对象的编程中,一些具有共性的对象叫做一个类,因此这些对象有一些相同的方法。所以可以在定义类的时候定义这些具有共性的方法,某种类的实例可以直接访问调用些方法。比如obj.toString(); obj2.toSTring()
。显然如果是obj.toString = function(){}
这样定义,是不好的。JS中给出的方案是,在类(e.g.
Object
)中定义一个prototype
属性,然后在类的实例中定义一个__proto__
属性。类的方法定义在prototype
,在创建实例的时候__proto__
赋值为这个值。(e.g.obj.__proto__ = Object.prototype
)。 当写下obj.toString()
的时候,解释器就可以通过obj.__proto__.toString
访问到在类Object.prototype
中定义的方法。实现了类中方法的共享。所以下面的代码是可以的。上述所说的类(e.g.
Ojbect
)在JS里面和函数合二为一了。所有对象都有__proto__
属性,只有函数才有prototype
属性。继承,以及存在的问题。。。略
JS里的一些语法糖(简写);