How to make a class in JavaScript?

前端 未结 4 1462
感情败类
感情败类 2020-12-12 01:38

There are lots of ways of doing the same thing in JavaScript. I have however picked up some ways, and some ways I frankly don\'t understand. Could anyone please help me clar

4条回答
  •  盖世英雄少女心
    2020-12-12 02:28

    Explaining the behaviour of different things in a constructed object by example:

    // 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
    })();
    

    After executing the above code, you have a constructor that creates objects with both instance-specific and shared variables. Now let's look at how they behave by creating two of instances and comparing them before and after some changes.

    // 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]
    

    Here are the two logged statements together for easier viewing

    //     myObjA               myObjB
    ["foo", "bar", true] ["foo", "bar", true]
    ["bar", "bar", true] ["bar", "foo", false]
    

提交回复
热议问题