我们所创建的每一个函数,解析器都会向函数中添加一个属性 prototype
    这个属性对应着一个对象,这个对象就是我们所有的原型对象
    如果函数作为普通函数调用 prototype 没有任何作用
    当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性
    指向该构造函数的原型对象,我们可以通过 proto 来访问属性

    1. function Fun(){
    2. Fun.prototype.name = "孙悟空";
    3. obj1.name = "猪八戒";
    4. }
    5. var obj1 = new Fun();
    6. var obj2 = new Fun();
    7. console.log(obj1.name); // 猪八戒
    8. console.log(obj2.name); // 孙悟空

    当我们访问对象的一个属性或方法时,他会先在对象自身寻找,如果有则直接使用

    • 如果没有则会去原型对象中寻找,如果找到则直接使用

      1. function Fun(){
      2. Fun.prototype.name = "孙悟空";
      3. obj1.name = "猪八戒";
      4. Fun.prototype.getName = function(){
      5. return this.name;
      6. }
      7. }
      8. var obj1 = new Fun();
      9. var obj2 = new Fun();
      10. // console.log(obj1.name);
      11. // console.log(obj2.name);
      12. console.log(obj2.getName()); // 孙悟空
      13. console.log(obj1.getName()); // 猪八戒

      以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中

    • 这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每一个对象都具有这些属性和方法。

    使用 in 检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回 true

    1. function Fun(){
    2. Fun.prototype.name = "孙悟空";
    3. obj1.name = "猪八戒";
    4. Fun.prototype.getName = function(){
    5. return this.name;
    6. }
    7. }
    8. var obj1 = new Fun();
    9. var obj2 = new Fun();
    10. // console.log(obj1.name);
    11. // console.log(obj2.name);
    12. console.log(obj2.getName()); // 孙悟空
    13. console.log(obj1.getName()); // 猪八戒
    14. 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

    1. 原型对象也是一个对象,所以它也有原型<br />当我们使用一个对象的属性或方法时,会现在自身中寻找
    2. - 自身中如果有,则直接使用
    3. - 如果没有则去原型对象中寻找,如果原型对象中有,则使用
    4. - 如果没有则去原型的原型中寻找,知道找到 Objcet 对象的原型
    5. - Object 对象的原型没有原型,如果在 Objcet 中依然没有找到,则返回 undefined
    6. ```javascript
    7. function Fun(){
    8. Fun.prototype.name = "孙悟空";
    9. obj1.name = "猪八戒";
    10. Fun.prototype.getName = function(){
    11. return this.name;
    12. }
    13. }
    14. var obj1 = new Fun();
    15. var obj2 = new Fun();
    16. // console.log(obj1.name);
    17. // console.log(obj2.name);
    18. console.log(obj2.getName()); // 孙悟空
    19. console.log(obj1.getName()); // 猪八戒
    20. // console.log(mc.hasOwnProperty("name")); // false
    21. console.log(obj1.__proto__.__proto__.haoOwnProperty("hasOwnProperty")); // true