我们所创建的每一个函数,解析器都会向函数中添加一个属性 prototype
这个属性对应着一个对象,这个对象就是我们所有的原型对象
如果函数作为普通函数调用 prototype 没有任何作用
当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性
指向该构造函数的原型对象,我们可以通过 proto 来访问属性
function Fun(){
Fun.prototype.name = "孙悟空";
obj1.name = "猪八戒";
}
var obj1 = new Fun();
var obj2 = new Fun();
console.log(obj1.name); // 猪八戒
console.log(obj2.name); // 孙悟空
当我们访问对象的一个属性或方法时,他会先在对象自身寻找,如果有则直接使用
如果没有则会去原型对象中寻找,如果找到则直接使用
function Fun(){
Fun.prototype.name = "孙悟空";
obj1.name = "猪八戒";
Fun.prototype.getName = function(){
return this.name;
}
}
var obj1 = new Fun();
var obj2 = new Fun();
// console.log(obj1.name);
// console.log(obj2.name);
console.log(obj2.getName()); // 孙悟空
console.log(obj1.getName()); // 猪八戒
以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中
这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每一个对象都具有这些属性和方法。
使用 in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回 true
function Fun(){
Fun.prototype.name = "孙悟空";
obj1.name = "猪八戒";
Fun.prototype.getName = function(){
return this.name;
}
}
var obj1 = new Fun();
var obj2 = new Fun();
// console.log(obj1.name);
// console.log(obj2.name);
console.log(obj2.getName()); // 孙悟空
console.log(obj1.getName()); // 猪八戒
console.log("name" in obj2); // true
可以使用对象 hasOwnProperty() 来检查对象自身中是否含有该属性
- 使用该方法只有当对象自身中函数有属性时,才会返回 true, ```javascript function Fun(){ Fun.prototype.name = “孙悟空”; obj1.name = “猪八戒”; Fun.prototype.getName = function(){ return this.name; } } var obj1 = new Fun(); var obj2 = new Fun(); // console.log(obj1.name); // console.log(obj2.name); console.log(obj2.getName()); // 孙悟空 console.log(obj1.getName()); // 猪八戒
console.log(mc.hasOwnProperty(“name”)); // false
原型对象也是一个对象,所以它也有原型<br />当我们使用一个对象的属性或方法时,会现在自身中寻找
- 自身中如果有,则直接使用
- 如果没有则去原型对象中寻找,如果原型对象中有,则使用
- 如果没有则去原型的原型中寻找,知道找到 Objcet 对象的原型
- Object 对象的原型没有原型,如果在 Objcet 中依然没有找到,则返回 undefined
```javascript
function Fun(){
Fun.prototype.name = "孙悟空";
obj1.name = "猪八戒";
Fun.prototype.getName = function(){
return this.name;
}
}
var obj1 = new Fun();
var obj2 = new Fun();
// console.log(obj1.name);
// console.log(obj2.name);
console.log(obj2.getName()); // 孙悟空
console.log(obj1.getName()); // 猪八戒
// console.log(mc.hasOwnProperty("name")); // false
console.log(obj1.__proto__.__proto__.haoOwnProperty("hasOwnProperty")); // true