原型prototype
我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
。这个属性值保存着一个地址,而这个地址指向的就是原型对象。
如果我们的函数作为普通函数调用,则prototype不起作用。
当函数以构造函数的形式调用时,则它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象。我们可以通过__proto__
来访问该属性。
function MyClass(){
}
var mc = new MyClass();
console.log(mc.__proto__);
console.log(MyClass.prototype);
console.log(mc.__proto__ == MyClass.prototype);
原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,所有我们可以将对象中共有的内容,统一设置到原型对象中。
MyClass.prototype.a = 123;
console.log(mc.a);
当我们访问对象的一个属性或者方法时,它会现在对象自身中寻找,如果有则直接使用,如果没有则去原型对象中寻找,如果没有,则去原型的原型中找,直到找到Object
对象的原型。因此可以将构造函数创建的对象共有的方法统一保存到原型对象里,则所有对象都可以访问到。
MyClass.prototype.sayName = function fun(){
alert(this.name);
};
使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
console.log(a in mc);
如果只想检查对象中的属性,可以使用hasOwnProperty()
方法。
console.log(mc.hasOwnProperty("a"));
console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
toString
当我们直接在页面中打印一个对象时,实际上是输出对象的toString()
方法的返回值。如果我们希望在输出对象时不输出[object Object]
,可以为对象添加一个toString()
方法。
如果想改变一个类中的每个对象的打印内容,可以给构造函数添加一个toString()
方法。
function Person(name, age, gender){
this.name = name;
this.age = age;
this.gender = gender;
};
Person.prototype.toString = function(){
return "我是" + this.name;
};
var obj1 = new Person("han",27,"male");
console.log(obj1);
当一个对象没有任何变量或属性对它进行引用,此时我们将永远无法操作该对象,这种对象就是一个垃圾,JS会自动销毁这些垃圾对象。
我们需要做的是将不需要的对象设置为null
即可
obj1 = null;