【问题标题】:Assigning a default value to a javascript using prototyping使用原型设计为 javascript 分配默认值
【发布时间】:2014-01-22 10:23:14
【问题描述】:

当我使用原型创建对象时,我希望能够为变量分配默认值。

当我尝试为变量分配默认值时,它们总是“未定义”。

我试图找到答案,但我尝试过的所有可能的解决方案都不起作用。

我的问题是:

  • 为什么我用值启动的变量的值是“未定义”
  • 我该如何解决我的问题?

    (function() {
        EmployeeNS = {};
    
        EmployeeNS.Employee =   function() {
                                    var _firstName;
                                    var _lastName;
                                    var _employeeID = 'Unassigned';
                                }
        EmployeeNS.Employee.prototype.setFirstName = function(fName) { this._firstName = fName; };
        EmployeeNS.Employee.prototype.getFirstName = function() { return this._firstName; };
        EmployeeNS.Employee.prototype.setLastName = function(lName) { this._lastName = lName; };
        EmployeeNS.Employee.prototype.getLastName = function() { return this._lastName; };
        EmployeeNS.Employee.prototype.setEmployeeID = function(employeeID) { this._employeeID = employeeID; };
        EmployeeNS.Employee.prototype.getEmployeeID = function() { return this._employeeID; };
    
        EmployeeNS.Worker = function() {
            var _department;
        }
        EmployeeNS.Worker.prototype = new EmployeeNS.Employee();
        EmployeeNS.Worker.prototype.constructor = Worker;
        EmployeeNS.Worker.prototype.setDepartment = function(department) { this._department = department; };
        EmployeeNS.Worker.prototype.getDepartment = function() { return this._department; };
    
    })();
    
    function createWorker() {
        var x = new EmployeeNS.Worker();
        x.setFirstName("John");
        x.setLastName("Doe");
        x.setDepartment("Transport");
    
        var message = x.getFirstName() 
                      + " " 
                      + x.getLastName()  
                      + " (Department: " 
                      + x.getDepartment()
                      + " / EmployeeID: " 
                      + x.getEmployeeID()
                      + ")";
        alert(message);
    }
    

谢谢

【问题讨论】:

  • undefined 到底是哪个值?请注意,您在构造函数中创建的变量仅对构造函数本地,它们与原型方法中的this.X 不同。 IE。 this._employeeID 确实是undefined,因为你从来没有创建过这个属性。

标签: javascript variables object prototyping


【解决方案1】:

你可以通过这样的改变来让它工作,

  EmployeeNS.Employee =   function() {
                            this._firstName;
                            this._lastName;
                            this._employeeID = 'Unassigned';
   }

试试这个方法,你可以通过包装Employee使这些变量真正私有,

(function() {
    EmployeeNS = {};

    (function() {
           var _firstName;
                                var _lastName;
                                var _employeeID = 'Unassigned';
    EmployeeNS.Employee =   function() {

                            }
    EmployeeNS.Employee.prototype.setFirstName = function(fName) { _firstName = fName; };
    EmployeeNS.Employee.prototype.getFirstName = function() { return _firstName; };
    EmployeeNS.Employee.prototype.setLastName = function(lName) { _lastName = lName; };
    EmployeeNS.Employee.prototype.getLastName = function() { return _lastName; };
    EmployeeNS.Employee.prototype.setEmployeeID = function(employeeID) { _employeeID = employeeID; };
    EmployeeNS.Employee.prototype.getEmployeeID = function() { return _employeeID; };

    })();

    (function() {
      var _department;        
     EmployeeNS.Worker = function() {

    }
    EmployeeNS.Worker.prototype = new EmployeeNS.Employee();
    EmployeeNS.Worker.prototype.constructor = Worker;
    EmployeeNS.Worker.prototype.setDepartment = function(department) { _department = department; };
    EmployeeNS.Worker.prototype.getDepartment = function() { return _department; };
    })();
})();

这里是jsfiddle

【讨论】:

  • _firstName, _lastName, _employeeID 在您的第二个示例中是私有的。但它们不是也是静态的,而不是每个实例,这不是 OP 的意思。
  • @Stefan ,是的,你是对的。即使它不是未定义的,它在 Worker 实例中也是静态的。
  • 所有变量都定义在一个闭包中,与简单的对象属性相比,这需要在 Javascript 端进行更多的工作来跟踪它们。请参阅 [developers.google.com/speed/articles/optimizing-javascript]:“创建闭包比创建没有闭包的内部函数要慢得多,而且比重用静态函数要慢得多。”
  • 这不能解决我的问题。它只是将变量移出另一个范围。我已经更改了代码,这似乎按预期工作:jsfiddle.net/rU8g3
【解决方案2】:

如果你想要实例属性,这样做:

(function() {
    EmployeeNS = {};
    EmployeeNS.Employee = function () {
        this._firstName = null;
        this._lastName = null;
        this._employeeID = 'Unassigned';
    };
    EmployeeNS.Employee.prototype.setFirstName = function(fName) { 
        this._firstName = fName; 
    };
})();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2020-05-14
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    相关资源
    最近更新 更多