1为什么要有原型:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //创建一个人类的构造函数 function Person(name , age){ //通过this,向新对象中添加属性 this.name = name; this.age = age; //向新的对象中添加一个sayName()方法 this.sayName = fun; } /* * 在构造函数中我们为每一个对象都添加了一个sayName()方法, * 而这个方法是在构造函数中创建的,构造函数每执行一次就要创建一个新的sayName()方法 * 每个对象中的sayName()方法都是不同,有几个对象就有几个sayName() * 但是这些函数的功能又是一摸一样的,所以我们没有必要创造出这么多一摸一样的函数 */ /* * 将函数定义到全局作用域中 ,的确可以解决问题,但是将它定义到全局作用域将会导致全局作用域的命名空间被污染。 * 同样也导致我们程序运行不安全 */ //将函数定义到构造函数的外部 function fun(){ console.log(this.name); }; //创建一个Person var per = new Person("孙悟空",18); var per2 = new Person("唐僧",16); var per3 = new Person("玉兔精",16); //console.log(per.sayName == per2.sayName); per3.sayName(); </script> </head> <body> </body> </html> 2.什么是原型: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> /* * 原型(prototype) * - 我们每次创建一个函数浏览器都会为函数添加一个属性 * 叫做prototype,这个属性对应的是一个对象 * 这个对象就是我们说的原型对象。 * - 如果以仅仅以函数的形式去调用函数,则原型对象没有任何作用 * - 当以构造函数的形式调用函数时,它所创建的对象中都会有一个隐含的属性 * 执行该函数的原型对象,我们可以通过__proto__来访问这个对象 * * - 所有的同一类型的对象他们都共享同一个原型对象,这个原型对象就相当于一个公共的区域 * - 当我们去调用一个对象的属性或方法时,它会先去对象自身中寻找, * 如果找到了则直接使用,如果没找到则去原型对象中寻找,如果原型中有则返回原型中的值 * 如果原型中没有,则去原型的原型中寻找,找到了则直接使用依次类推。。。 * 注意:Object的原型的原型为null,所以会一直找Object的原型, * 如果他里面依然没有,则返回undefined * - 我们可以将对象中共有的属性或方法统一添加到原型中, * 这样我们不用添加多个重复的属性或方法,也不会污染全局作用域 */ function MyClass(){ } //向函数的原型对象中添加一个属性 MyClass.prototype.hello = "你好"; MyClass.prototype.fun = function(){ alert("我是原型中的fun"); }; //创建MyClass的实例 var mc = new MyClass(); var mc2 = new MyClass(); var mc3 = new MyClass(); mc.hello = "mc的你好"; //console.log(mc3.__proto__ == MyClass.prototype) //console.log(mc2.hello); //mc2.fun(); //创建一个人类的构造函数 function Person(name , age){ //通过this,向新对象中添加属性 this.name = name; this.age = age; } //向Person的原型中添加sayName() Person.prototype.sayName = function(){ console.log(this.name); }; var per = new Person("孙悟空",18); var per2 = new Person("唐僧",16); var per3 = new Person("玉兔精",16); per3.sayName(); </script> </head> <body> </body> </html>3.怎么使用原型: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> //创建一个人类的构造函数 function Person(name , age){ //通过this,向新对象中添加属性 this.name = name; this.age = age; } //向Person的原型中添加sayName() Person.prototype.sayName = function(){ console.log(this.name); }; //创建一个Person的实例 var per = new Person("孙悟空",18); //当我们打印一个对象时,控制台往往会输出 [object Object] //此时实际上输出的内容是对象的toString()方法的返回值 var str = per.toString(); //console.log(str); //检查per中是否有toString //如果属性在对象的原型中,使用in也会返回true //console.log("toString" in per); //console.log(per.hasOwnProperty("toString")) ; //console.log(per.__proto__.__proto__.hasOwnProperty("toString")); //console.log(Object.prototype.__proto__); //修改per的toString() /*per.toString = function(){ //return "我是一个可爱的Person" ; return "Person[name = "+this.name+" ,age = "+this.age+"]"; };*/ //修改Person原型的toString Person.prototype.toString = function(){ //return "我是一个可爱的Person" ; return "Person[name = "+this.name+" ,age = "+this.age+"]"; }; var per2 = new Person("白骨精",16); console.log(per); </script> </head> <body> </body> </html>
