<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <script type="text/javascript"> // 原型 // 构造函数的prototype属性的值 function Person() { this.name = "adfs"; } // 访问原型: // console.log(Person.prototype); // 给原型添加的方法 Person.prototype.say = function() { // console.log("这事原型的方法"); console.log(this.name); }; Person.prototype.name = "aaaaaaa"; // 表示非公开的方法, 可以使用,但是 可能存在问题 // Person.prototype._init = function() {}; // 通过构造函数来创建对象 var p = new Person(); // 通过p这个实例,来访问到原型中的方法或者是属性 p.say(); Person.prototype.say(); // 以下两种方式调用的区别: // p.say(); // Person.prototype.say(); // // 1 通过对象来调用方法是 通过属性搜索原则找到的方法,然后再调用 // 2 直接访问到方法,然后再调用的 // 3 方法内部的 this 指向不同 // 方法内部的this :谁调用的方法,this就是指向谁 // __proto__ // 还可以通过通向直接访问到原型 // 只要是带有 __ 就表示非标准的属性, 不能不再实际项目中使用 // 有些框架中写的方法的名字也带有下划线: // 表示这些方法是再框架内部使用的 // 如果,你拿来使用,出问题了,框架不负责 // p.__proto__ console.log(Person.prototype === p.__proto__); // true // 构造函数的prototype属性 和 对象的__proto__表示的就是同一个对象 // 只不过是 通过不同的方法来访问这个对象(原型) p.__proto__.say(); // console.log(p.__proto__); // 两个术语: // prototype 原型属性 // __proto__ 原型对象 // 就好比是 o1和o2是两个变量,但是这两个变量就是同一个对象 // var o1 = {}; // var o2 = o1; </script> </body> </html>