2

私が働いているいくつかの内部アプリケーションで使用するカスタム オブジェクトを作成しています。私はこれを行うためのいくつかの方法を調査しました-そしてこれが私が思いついたものです.

function ISGrader(text)
{
this.text = text;

this.printInfo = function(){
    alert("Object working " + text);    
}

this.putGrade = function(score)
{
           alert(score);
}
 }

これは、コンストラクター型の機能と、これから構築するいくつかの単純なスターター メソッドを示していると思います。

上記の良い習慣ですか、それともより標準的な別の方法がありますか?

4

5 に答える 5

2

私は以下のようなパターンを好みます。これは、次の 4 段階のアプローチと考えることができます。

(function(parent) {

// 1. Declare private variables and functions that will be
// accessible by everybody within the scope of this 
// function, but not outside of it.
var doSomethingAwesome = function() { .. }; // private function
var coolInteger = 42; // private variable

// 2. Create the constructor function
function ISGrader() {
    ..
}

// 3. Create shared public methods on the prototype object.
// These will be created only once, and shared between all objects
// which is more efficient that re-creating each method for each object.
ISGrader.prototype.printInfo = function() { .. };
ISGrader.prototype.putGrade = function(score) { .. };

// 4. Expose the constructor to the outside world.
parent.ISGrader = ISGrader;

})(window);

すべてが自己実行型の無名関数内に含まれている理由は、内部で作成したプライベート変数が外側のスコープに漏れないようにするためであり、基本的に物事をクリーンに保つためです。

このようにコンストラクターを宣言するもう 1 つの利点は、単語を 1 つ変更するだけで、親オブジェクトを簡単にwindow別の名前空間オブジェクトに変更できることです。

于 2012-08-09T18:47:08.547 に答える
2

私はこのパターン ( IIFE ) を好みますが、これは純粋に意見です:

var ISGrader = (function (text) {
    // anything declared here is "private"
    var printInfo = function() {
        alert("Object working " + text);    
    };

    var putGrade = function (score) {
        alert(score);
    };

    // put "publicly" accesible things in the returned object
    return {
        text: text,
        printInfo: printInfo,
        putGrade: putGrade
    };
})(text);
于 2012-08-09T18:18:36.537 に答える
1

`prototype' を使用して行うことを常にお勧めします。このようにして、そのプロパティを継承して新しいプロパティを作成することもできます。

var ISGrader = function(text) {
    this.text = text;

    var _privateVar = text;

    this.updatePrivateVar = function(newText) {
        _privateVar = newText;
        alert("private variable updated");
    }
}
ISGrader.prototype.text = "";
ISGrader.prototype.printInfo = function() {
    alert("Object working " + this.text);
}
ISGrader.prototype.putGrade = function(score) {
    alert(score);
}

var isGrader = new ISGrader("hello");
isGrader.printInfo();



// Inherit and create a new definition
var ISGrader2 = function() {}
ISGrader2.prototype = new ISGrader();

var isGrader2 = new ISGrader("hello2");
isGrader2.printInfo();
isGrader2.updatePrivateVar("hello3");

デモ: http://jsfiddle.net/rkspP/3/

于 2012-08-09T18:19:52.980 に答える
0

1つのページに複数のオブジェクトを作成することを計画している場合は、次のようISGraderに割り当てられたプロトタイプオブジェクトに関数を固定する方がメモリ効率が高くなります。ISGrader

function ISGrader(text) {
    this.text = text;
}

ISGrader.prototype = {
    printInfo: function() {
        alert("Object working " + this.text);
    },
    putGrade: function(score) {
        alert(score);
    }
}
于 2012-08-09T18:22:34.753 に答える
0

本当の答えではありませんが、Douglas Crockford の本JavaScript: The Good Partsをお勧めします。これは、言語の "良い部分" を紹介し、JavaScript でオブジェクトを作成するさまざまな方法の長所と短所について説明しているからです。

JavaScript オブジェクトでのメンバーの可視性についての説明を探しているだけの場合は、次のリソースを確認することもできます: http://javascript.crockford.com/private.html

于 2012-08-09T18:20:06.800 に答える