JSプロトタイプ設計モード(四)の欠陥(一)

7699 ワード

前の三編で紹介したのは全部プロトタイプのメリットです.今日はプロトタイプの弊害を説明します.
var Person = function () {
    this.class='ddd';
    this.toString=function(){};
};
Person.prototype.name = 'tlc';
Person.prototype.age = '25';
Person.prototype.sex = 'boy';
Person.prototype.sayInfo = function () {
    console.info(this.name + "--" + this.age + "--" + this.sex)
};
毎回プロトタイプに属性や方法を追加するたびにPerson.prototypeというフィールドを書き換えます.このような書き方は複雑すぎるので、Person.prototypeをオブジェクトに向けることができます.このオブジェクトには必要な属性と方法が含まれています.
var Person = function () {
};
Person.prototype = {
    name: 'tlc',
    age: '19',
    sex: 'boy',
    sayInfo: function () {
        console.info(this.name + "--" + this.age + "--" + this.sex)
    }
};
は、プロトタイプのオブジェクトのconstructorがPersonではないことを指しています.これらのコードはプロトタイプのオブジェクトを書き換えるのに相当します.jsでは、この関数を作成するたびにプロトタイプのオブジェクトを作成します.このコードの後のconstrutorは、新規作成のオブジェクトconstructuctorを指します.
var person1 = new Person();
console.log(person1.constructor == Person);//false
console.info(person1.constructor == Object);//true
は手動でconstructor属性を追加できますが、この属性は列挙できます.この属性を列挙したくないなら、defineProperty方法を使ってもいいです.この属性は列挙できません.
Person.prototype = {
    constructor:Person,
    name: 'tlc',
    age: '19',
    sex: 'boy',
    sayInfo: function () {
        console.info(this.name + "--" + this.age + "--" + this.sex)
    }
};
var person1 = new Person();
console.log(person1.constructor == Person);//true
console.info(person1.constructor == Object);//false
Object.defineProperty(Person.prototype,'constructor',{
    enumerable:false,
    value:Person
});