<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>原型对象</title> </head> <body> <script type="text/javascript"> //定义对象(构造函数 和 原型对象 混合定义方式) //将属性定义在构造函数中,将方法定义到原型对象中 function Person(n,a){ this.name = n; this.age = a; } //js给每一个构造函数,都自动分配了一个公共的对象,用来存放这个构造函数实例化后的所有实例对象 公共的成员,这个公共对象就叫做原型对象,可以通过构造函数的prototype属性取到 // console.log(Person.prototype); //把方法写到原型对象里面 Person.prototype.say = function(){ console.log(‘我叫‘ + this.name + ‘,我今年‘ + this.age + ‘岁‘); } Person.prototype.walk = function(m, n){ console.log(‘我走的很快‘); // return m+n; } //多次实例化构造函数,得到多个对象 var person1 = new Person(‘张飞‘, 30); var person2 = new Person(‘刘备‘, 40); //Person构造函数的每一个实例对象,都可以直接使用对应的原型对象上的方法 person1.say(); person1.walk(1,2); person2.say(); </script> <script type="text/javascript"> //原型对象上的所有成员,它对应的实例对象,都可以直接使用 //定义一个构造函数 /*function Person(n,a){ this.name = n; this.age = a; } //通过原型对象设置方法 Person.prototype.say = function(){ console.log(‘我叫‘ + this.name + ‘,我今年‘ + this.age + ‘岁‘); } //实例化构造函数得到 实例对象 var person1 = new Person(‘张飞‘, 30); console.log(person1); //构造函数的prototype属性 存的是原型对象 console.log(Person.prototype); //实例对象的__proto__属性 存的也是原型对象 console.log(person1.__proto__); console.log(person1.__proto__ === Person.prototype);//true //通过原型对象的constructor属性,取到构造函数 console.log(Person.prototype.constructor); //实例对象也可以直接使用原型对象上的constructor console.log(person1.constructor); */ //特殊情况(存在问题的一种用法) // function Person(n,a){ // this.name = n; // this.age = a; // } // //向原型对象上添加一个方法 // // Person.prototype.say = function(){ // // console.log(‘我叫‘ + this.name + ‘,我今年‘ + this.age + ‘岁‘); // // } // //直接替换了原来的原型对象 // //产生的问题,原型对象本身的constructor属性丢失了,会取到Object函数 // Person.prototype = { // "constructor":Person, //需要手动指定构造函数 // "say":function(){ // console.log(‘我叫‘ + this.name + ‘,我今年‘ + this.age + ‘岁‘); // } // }; // //字面量对象 有自己的构造函数,就是Object函数 // var person1 = new Person(‘张三‘, 30); // console.log(person1.constructor); // console.log(Person.prototype.constructor); // console.log(Person.prototype); // console.log(Person.prototype.__proto__); // console.log(person1.__proto__.__proto__); //找到一个对象的原型对象,还可以继续找原型对象的原型对象,直到找到最顶层(Object.prototype)为止 //定义两个构造函数 function A(){ // this.age = 20; } function B(){ // this.age = 30 } //实例化 构造函数A得到一个对象 var obj = new A(); //将A的实例对象,设置为 B的原型对象 B.prototype = obj; //实例化 构造函数B var obj2 = new B(); console.log(obj2); console.log(obj2.__proto__);// obj console.log(obj2.__proto__.__proto__); // A.prototype 相当于是 new Object() console.log(obj2.__proto__.__proto__.__proto__); //Object.prototype // 这种原型对象的链式结构,叫做是原型链 console.log(obj2.age); // 查找一个对象的成员,先从自身找(包括自身构造函数中定义的成员), // 如果找到就直接使用。 // 如果没找到,就继续在自身的原型对象上找, // 如果找到就使用原型对象的成员 // 如果没找到,继续在原型对象的原型对象上找 。。。。 // 直到找到最顶层的原型对象(Object.prototype) // 这种根据原型对象的链式结构,进行的链式查找方式,通常也叫做原型链(从查找对象的成员的方式角度) </script> </body> </html>
原文:https://www.cnblogs.com/dazahui/p/14432007.html