如何在JavaScript中创建一个类?

Stu*_*rts 2 javascript json

在JavaScript中有很多方法可以做同样的事情.然而,我已经采取了一些方法,而且我坦率地不明白.有谁可以帮我澄清一些事情?(我首先在PHP中学习了OOP.)

所以一个类可以像这样:

var object = new class(constructparams) {
    var private_members; // Can be accessed from within the code inside this definition only.
    this.public_members; // Can be accessed from everywhere.

    var private_functions = function() {}
    this.public_functions = function() {}
}

object.prototype.semi_public_members = function() {
    // Will be public, but can only access public members and methods.
    // E. g. private_members; is not available here.
}
Run Code Online (Sandbox Code Playgroud)

这到目前为止都是正确的吗?

然后有人喜欢自动执行匿名函数方法来创建命名空间.有什么意义,当你有这样的方式做同样的事情,提供一个命名空间?

最后你有我不明白的对象字面符号.

var object = { // Something strange in here }
Run Code Online (Sandbox Code Playgroud)

那里发生了什么?是JSON吗?它是如何使用的,我该如何使用它.使用这种方式而不是使用我描述的方法有什么好处?你为什么要原型而不是第一次正确地上课?

Pau*_* S. 5

通过示例解释构造对象中不同事物的行为:

// Defined as a variable from an anonymous function
// so that there is scope closure over variables
// shared across all instances and the prototype.
// If this isn't important, you don't need to close
// scope around it, so define directly
var ConstructedObject = (function constructorCreator () {
    // Define any variables/methods to be shared across
    // all instances but not polluting the namespace
    var sharedVariable = 'foo';

    // Next the actual constructor
    function ConstructedObject () {
        // Variables here are normally used to help
        // each instance and will be kept in memory as
        // long as the instance exists
        var instanceVariable = 'bar';
        // instance-specific properties get defined
        // using the "this" keyword, these are the
        // properties expected to be changed across
        // each different instance
        this.instanceProperty = true;
        this.instanceMethod = function () { return instanceVariable; };
        this.changeInstanceVar = function () { instanceVariable = 'foo'; };
            // you do have access to the shared
            // variables here if you need them.
    }
    // After the constructor, you set up the
    // prototype, if any. This is an object of shared
    // properties and methods to be inherited by every
    // instance made by the constructor, and it also
    // inherits the prototype's prototype, too.
    // Lets use a literal object for simplicity.
    ConstructedObject.prototype = {
        // Accessing the instance to which a method
        // applies is done using the "this" keyword,
        // similar to in the constructor
        sharedMethod : function () { return [sharedVariable, this.instanceMethod(),this.instanceProperty]; },
        changeSharedVar : function () { sharedVariable = 'bar'; }
        // properties may also be defined
    };
    // Finally, the constructor is returned so it
    // can be kept alive outside of the anonymous
    // function used to create it
    return ConstructedObject;
// and the anonymous function is called to execute
// what we've done so far
})();
Run Code Online (Sandbox Code Playgroud)

执行上面的代码后,您有一个构造函数,它创建具有特定于实例和共享变量的对象.现在让我们通过创建两个实例并在一些更改之前和之后比较它们来查看它们的行为方式.

// First create the two instances
var myObjA = new ConstructedObject(),
    myObjB = new ConstructedObject();
// Now compare them, the sharedMethod method we
// used in the prototype offers an easy way to
// do this
console.log( myObjA.sharedMethod(), myObjB.sharedMethod() );
// ["foo", "bar", true] ["foo", "bar", true]
// Next lets change the different variables in
// myObjB so we can see what happens, again the
// change* methods defined before let us do this
// easily
myObjB.changeInstanceVar();
myObjB.changeSharedVar();
// For completeness, lets also change the property
// on myObjB.
myObjB.instanceProperty = false;
// Now when we compare them again, we see that our
// changes to the myObjB instance have only changed
// the shared variables of myObjA
console.log( myObjA.sharedMethod(), myObjB.sharedMethod() );
// ["bar", "bar", true] ["bar", "foo", false]
Run Code Online (Sandbox Code Playgroud)

以下是两个记录的语句,以便于查看

//     myObjA               myObjB
["foo", "bar", true] ["foo", "bar", true]
["bar", "bar", true] ["bar", "foo", false]
Run Code Online (Sandbox Code Playgroud)

  • 在Google上无休止地搜索之后,我终于找到了一个教程,解释了原型设计的基础知识.我刚才知道_它有效,而不是_how_.现在这很有道理!再次感谢! (2认同)