简单原型
1、简单原型
function Person() { } Person.prototype = { name : "xiao A", age : 26, say : function () { alert("I am simple prototype function"); } } var p1 = new Person(); alert(Person.prototype.constructor) // function Object() { [native code] } for(attr in p1){ alert(attr); // name age say }
上面的方法虽然在创建原型属性的时候比较便捷,但是他改变了 Person.prototype 的 constructor , 因此需要对上面的方法进行改造
2 、方法一
function Person() { } Person.prototype = { constructor : Person, name : "xiao A", age : 26, say : function () { alert("I am simple prototype function"); } } var p1 = new Person(); alert(Person.prototype.constructor) // function Person() { } for(attr in p1){ alert(attr); // constructor name age say }
该方法实现了 在使用简单原型时,不改变 原型的构造器 即 Person.prototype 的 constructor ,他的缺点是 constructor 属性变成了 可枚举的属性,所以还需要对其进行改进
3、 Object.defineProperty() 可以为原型对象重新加入构造器
function Person() { } Person.prototype = { name : "xiao A", age : 26, say : function () { alert("I am simple prototype function"); } } Object.defineProperty(Person.prototype,"constructor",{ enumerable : false, // 指定属性不可枚举 value : Person // 指定 值 }) var p1 = new Person(); alert(Person.prototype.constructor) // function Person() { } for(attr in p1){ alert(attr); // name age say }
4、原型的动态特性
// 原型的动态特性 function Person() { } var p1 = new Person(); Person.prototype.say = function () { alert("我是原型特性") } p1.say(); // 我是原型特性
function Person() { } var p1 = new Person(); Person.prototype = { constructor : Person, say : function () { alert("我是原型的函数!") } } p1.say(); // p1.say is not a function
function Person() { } Person.prototype = { constructor : Person, say : function () { alert("我是原型的函数!") } } var p1 = new Person(); p1.say(); // 我是原型的函数!
注意 : 简单原型使用的顺序(实例对象必须在原型对象之后创建)