你能在原型函数中访问原型属性吗?

时间:2014-06-16 18:15:06

标签: javascript prototype

如果我宣布这样一个类:

var Foo = function() {};

并像这样添加属性:

Foo.prototype.bar = "";

为什么我不能像这样访问该属性:

Foo.prototype.setBar = function( value ) {
   this.bar = value;
}

在我的代码中,我Foo.prototype.bar的范围内没有Foo.prototype.SetBar。 this.bar显示未定义。

更新

好吧也许我应该更具体一点,因为由于某些原因我的代码没有运行。

var JSocketServer = function( options, callback ) {
    if( typeof(options) != "object" ) {
        callback("Invalid object passed for options");
        return;
    }
    if( typeof(options.port) != "number" ) {
        callback("Must specify a port number in options");
        return;
    }

    // Hook up Event Emitter Functionality
    mevents.EventEmitter.call(this);

    this.initServer( options, callback );
};

// Set up static class properties
JSocketServer.prototype.socketPool = {};
JSocketServer.prototype.socketMap = {};

// Inherit from EventEmitter
mutil.inherits(JSocketServer, mevents.EventEmitter);


JSocketServer.prototype.initServer = function( options, callback ) {
    // Hook up raw tcp server
    var jserver = this;
    var server = mnet.createServer( function( socket ) {
        jserver.handleSocket( socket, callback );
    });

    server.listen(options.port, function() {
        console.log("Socket Server is bound");
    })

    this.serverListener( server )
}

JSocketServer.prototype.handleSocket = function( socket, callback ) {
    var jsocketServer = this;
    var jsocket = new mjsocket(socket);

    console.log("Socket: "+jsocket.socketID+" connected");

    this.socketPool[jsocket.socketID] = jsocket;

    jsocket.on("data", function( data ) {
        // Add socket id to socket map
        jsocketServer.socketMap[jsocket.moduleID] = jsocket.socketID;
    });

    jsocket.on("close", function(err) {
        jsocketServer.removeSocket(jsocket.socketID);
    });

    // Callback with JSocket
    callback( undefined, jsocket );
}

现在在JSocketServer.prototype.handleSocket内部,我正在尝试为this.socketPool分配一个键和值,它表示this.socketPool未定义。现在从我的理解和你们所说的话来看,这不应该是。

更新

这是我的代码http://jsfiddle.net/bZrtn/的JS小提琴。我有2个类JSocketServer和JSocket,它们被底部的APP使用。

2 个答案:

答案 0 :(得分:4)

是的,您可以但仅在检索值时。设置该值将创建实例propety。如果指定实例属性,则将返回它而不是原型值。这意味着您可以:

Foo.prototype.radius = 5;
Foo.prototype.diameter = function() {
   return this.radius * 2;
};

var circle = new Foo();
console.log(circle.diameter()); // prints 10
circle.radius = 10;
console.log(circle.diameter()); // prints 20 just for this instance

以下是根据以下网站http://docstore.mik.ua/orelly/webprog/jscript/ch08_04.htm

中的圆圈说明的示例和示例

enter image description here

JSFiddle来展示原始问题。

答案 1 :(得分:2)

// Set up static class properties
JSocketServer.prototype.socketPool = {};
JSocketServer.prototype.socketMap = {};

// Inherit from EventEmitter
mutil.inherits(JSocketServer, mevents.EventEmitter);

// Set static class properties
JSocket.prototype.moduleID = "";
JSocket.prototype.dataArray = [];
JSocket.prototype.dataString = "";

// Inherit from EventEmitter
mutil.inherits(JSocket, mevents.EventEmitter);

是使您的代码无效的部分。 utils.inherit覆盖 .prototype JSocketServer {和JSocket一个新的对象继承自EventEmitter

仅在继承后才能对原型对象进行分配!

// Inherit from EventEmitter first
mutil.inherits(JSocketServer, mevents.EventEmitter);

// then set up static class properties
JSocketServer.prototype.socketPool = {};
JSocketServer.prototype.socketMap = {};

…

// Inherit from EventEmitter first
mutil.inherits(JSocket, mevents.EventEmitter);

// then set static class properties
JSocket.prototype.moduleID = "";
JSocket.prototype.dataArray = [];
JSocket.prototype.dataString = "";

顺便说一下,对于静态属性,您可能(更好?)将它们直接放在构造函数上而不是原型上,即

JSocketServer.socketPool = {};
JSocketServer.socketMap = {};

然后总是使用这个完全限定的名称显式引用它们,而不是作为(继承的)实例属性。