原型对象

在上一篇文章中写道,在Person构造函数中,为每一个对象都添加了一个sayName方法是没有必要的,完全可以使所有的对象都调用一个方法。可以通过 将一个全局作用域下的函数赋值给类的属性。

但是,

将函数定义在全局作用域,会污染了全局作用域的命名空间,而且定义在全局作用域中也很不安全。

 

为了解决这个问题,接下来,我们引入原型对象。

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta charset="utf-8">
 5         <title></title>
 6     <script type="text/javascript">
 7    /* 原型prototype 
 8    我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
 9    这个属性对应着一个对象,这个对象就是我们所谓的原型对象
10    
11    如果函数作为普通调用prototype没有任何作用
12    当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,
13    指向该构造函数的原型对象,可以通过__proto__来访问
14    
15    原型对象相当于一个公共的区域,所有同一个类是实例都可以访问到这个原型对象
16    可以将对象中共有的内容,统一设置到原型对象中
17    
18    当我们访问对象的一个属性或方法是,它会先在对象自身中寻找,如果有则直接使用,
19    如果没有则会去原型对象中寻找,如果找到则直接使用
20    所以,可以将对象共有的属性或方法添加到构造函数的原型对象中
21    */
22   
23   function Person(){
24       
25   }
26   function MyClass(){
27       
28   }
29   //向MyClass的原型中添加属性a
30   MyClass.prototype.a=123;
31   MyClass.prototype.name="我是原型中的名字";
32   var mc=new MyClass();
33   console.log(mc.a);//123
34   console.log(mc.__proto__);
35   console.log(Person.prototype==MyClass.prototype);//false
36   //使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true
37   console.log("name" in mc);//true
38   //可以使用对象的hasOwnProperty()来检查对象自身是否含有该属性
39   //使用该方法只有当对象自身中含有属性时,才会返回true
40   console.log(mc.hasOwnProperty("name"));//true
41   /*
42   原型对象也是对象,所以也有原型
43   当我们在使用一个对象的属性或方法时,会先在自身中寻找
44     自身中如果有,则直接使用
45     如果没有则去原型对象中寻找,如果原型对象中有则使用
46     如果没有则去原型的原型中寻找,直到找到Object对象的原型
47     Object对象的原型没有影响,如果在Object中仍然没有找到,则返回undefined
48   */
49   console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));//false
50   console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));//true
51     </script>
52     <head>
53     <body>
54     </body>
55 </html>

 

posted @ 2019-07-21 18:41  zuiaimiusi  阅读(129)  评论(0编辑  收藏  举报