0

我像这样调用下面的对象方法。

new Cout( elem1 ).load( 'body' )

new COut( elem1 ).display( 'email' )

我一次只使用一个实例。因为我一次只使用一个实例,所以我想删除this.element并使用传入的实例element

这让我想知道传入的元素是静态的还是基于实例的。我认为它可能是 this.element (基于实例)......即使我没有明确说明它。我计划删除所有提及 this.element 的元素。

是吗?

注意:如果没有给出其他返回,则隐式返回。

var COut = function ( element ) 
{
    var messages = 
    {
        name:         'Please enter a valid name',
        email:        'Please enter a valid email',
        email_s:      'Please enter a valid email.',
        pass:         'Please enter password, 6-40 characters',
        url:          'Please enter a valid url',
        title:        'Please enter a valid title',
        tweet:        'Please enter a valid tweet',
        empty:        'Please complete all fields',
        same:         'Please make emails equal',
        taken:        'Sorry, that email is taken',
        validate:     'Please contact <a class="d" href="mailto:fo@foo.com">support</a> to reset your password'
    };
    this.element = element;
    this.display = function( type ) 
    {
        this.element.innerHTML = messages[ type ];
    };
    this.load = function( location )
    {
        new AjaxRequest().invoke( 'ajax_type=async_load', function( response_text )
        {
            document[location].innerHTML = response_text;  
            new Cin().init( response_text.charAt( 6 ) ); // Correlate this point to Ajax Call.
        } ); 
    };
};
4

3 回答 3

3

element也不是。它是构造函数的局部变量,将在每次调用时定义。它只是一个属性,this因为它已被明确设置:

var COut = function ( element ) 
{
    // ...
    this.element = element;
    // ...
};

尽管如此,使用它而不是this.element应该与构造函数中定义的任何函数/方法一起正常工作:

var COut = function ( element ) 
{
    // ...
    this.display = function( type ) 
    {
        element.innerHTML = messages[ type ];
    };
    // ...
};

如果您改为使用prototype在构造函数之外定义方法,则无法访问它。在这里,element不在范围内;但this会,也会如此this.element

COut.prototype.display = function ( type ) {
     this.element.innerHTML = messages[ type ];

     element.innerHTML = messages[ type ]; // ERROR: `element` is not defined
};
于 2012-05-28T16:47:52.890 回答
1

当您使用this它时,您需要使用关键字实例化该类的成员new,否则如果this不创建类的实例就没有使用的意义。

此外,您通过设置的任何内容都将this成为实例成员,这意味着它会添加到您创建的每个实例签名中。您可以通过使用prototype属性来避免这种情况。

于 2012-05-28T16:32:43.723 回答
0

如果您不使用this并且只是element在函数中引用,那么它将引用element您在参数中传递的那个。

new每次引用对象时都在使用,但我认为这是错误的。每个实例都不知道您之前放置的属性,this并且您每次都必须传入相同的元素(这就是您正在做的事情,但如果您只是在第一次保存对象时不需要这样做实例化它)。

就是new这样 - 为您提供一个干净的对象this

我认为你想要的是这样的:

var c = new Cout(some_element);
c.display();

如果你在构造函数中将元素保存为 this 的属性,那么当你调用c.display()它时就可以正常访问this.element了。

于 2012-05-28T16:36:14.880 回答