javascript - 您可以在原型(prototype)函数中访问原型(prototype)属性吗?

标签 javascript prototype

如果我声明一个这样的类:

var Foo = function() {};

并向其添加属性,如下所示:

Foo.prototype.bar = "";

为什么我无法像这样访问该属性:

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

在我的代码中,Foo.prototype.SetBar 范围内没有 Foo.prototype.bar。 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 未定义。现在根据我的理解和你们所说的,这不应该是。

更新

这是我的代码的 JS Fiddle http://jsfiddle.net/bZrtn/ 。我有 2 个类 JSocketServer 和 JSocket,它们正在由底部的 APP 使用。

最佳答案

是的,您可以,但仅限于检索值时。设置该值将创建一个实例属性。如果您指定实例属性,则将返回该属性而不是原型(prototype)值。这意味着您可以:

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演示原始问题。

关于javascript - 您可以在原型(prototype)函数中访问原型(prototype)属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24249721/

相关文章:

JavaScript 继承问题

javascript - 如何重构复杂的 JavaScript 函数?

javascript - 为什么一个对象的方法不能用于另一个对象?

javascript - 使用 ng-repeat 解析不均匀的 data/json 对象

javascript - Phantom JS 消除屏幕截图的边距

javascript - 动态函数调用不改变

javascript - _.extend(Something.prototype, someObj) 和 Something.prototype.someFunc = someFunc 有什么区别?

javascript - 当鼠标悬停在另一个事件上时,全日历更改事件的颜色

javascript - 隐藏多个 div,直到鼠标悬停在各个链接上,然后显示每个

javascript - 扩展原型(prototype)而不是声明整个对象的优点