Prototype原型链知识

最近我看了一位前端攻城狮写的博客,写的是关于js中的原型链的知识,对于原型链,我还是知道的,这是js特有的继承特性,可以说就是因为有了prototype才有了js的继承。

for in 循环

for in 循环可以把对象的所有私有属性和继承属性都打印出来,当然这里的对象不是js变量类型中的那种变量,因为严格意义上来说js中所有的变量类型都是对象,他们拥有很多种不同的继承方法,toString()就是其中之一。

有时候我们只需要对象的私有方法,则我们需要在for in循环中添加额外的判断语句: hasOwnProperty()

for(var i in obj) {
    if(obj.hasOwnProperty(i)) {
        console.log(i);
    }
}

这种方法可以打印对象的私有属性。

prototype

prototype实际上也是一个js对象,我们可以在这个对象上添加新的方法,让它的构造函数及其后代都拥有这种方法。

function a() {};
var b = new a();
a.prototype.plus = function(i,j){return i+j};
b.plus(2,3);  //5

constructor

constructor用来指向调用对象的构造函数。

function a() {};
var b = new a();
b.constructor === a; //true
a.prototype.constructor === a //true
b.constructor.prototype.constructor === a //true

注意

虽然prototype是一个对象,但是我们也不可直接为他赋值。

function a(){};
var b = new a();
a.prototype = {
    plus: function(i,j){return i+j};
};
a.prototype.constructor == a; //false
b.constructor === a; //false

真脆弱,原型链就这么断掉了,继承关系也没了,所以千万不要这么做!
但是万一这么做了,怎么办,其实也可以修复这种情况:

a.prototype.constructor = a;
var c = new a();
c.constructor = a; //true

修复好了。