原型对象
在上一篇文章中写道,在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>