最近我看了一位前端攻城狮写的博客,写的是关于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
修复好了。