从Object.create(obj,props)中访问属性的props定义对象

时间:2017-07-04 23:32:15

标签: javascript scope this javascript-objects

我遵循基于page object pattern for use with WebDriver JS的自动化代码。该教程调用了一个页面对象,它看起来像下面的内容,使用Object.create()来创建一个扩展一个简单的Page对象的对象 - 但是他们的示例并没有涵盖具有引用{{的函数的内容。 1}}来自创建的对象内部。我尝试在属性配置中以几种不同的方式更改对象参数thisget,并且到目前为止还没有注意到差异。

page.js:

value

login.page.js:

"use strict";

function Page() {

}

Page.prototype.open = function(path) {
    browser.url('/' + path);
};

Page.prototype.getUrl = function() {
    return browser.getUrl();
};

module.exports = new Page();

test.spec.js

"use strict";

var Page = require('./page');

var LoginPage = Object.create(Page, {
    email:          { value: 'input#email' } ,
    password:       { value: 'input#password' } ,
    loginButton:    { value: 'button#login-button' },
    errorText:      { value: 'span.help-block' },

    loginErrorMessage: { value: 'These credentials do not match our records.' },

    open: { value: function() {
        Page.open('login');
    }},

    loginAsTestUser: { value: function() {
        this.open(); 
        browser.logger.info('Logging in');
        this.login('test@dev.com', 'test');
    }},

    login: { value: function(email, password) {
        browser.element(this.email).setValue(email);
        browser.element(this.password).setValue(password);
        browser.element(this.loginButton).click();
    }}
});

module.exports = LoginPage;

这是"use strict"; var LoginPage = require('../pages/login.page.js'); var Header = require('../pages/header.page.js'); describe('Navigation bar', function() { before('open login page', LoginPage.open); it('should be visible', function() { browser.isVisibleWithinViewport(Header.navbar).should.be.true; }); describe('when logged in', function() { before('login', LoginPage.loginAsTestUser); it('should have the Add dropdown list displayed', function() { browser.isVisibleWithinViewport(Header.addDropdownButton).should.be.true; }); after('logout', Header.logout); }); }); 的错误:

this.open

1) Navigation bar when logged in "before all" hook: this.open is not a function running chrome TypeError: this.open is not a function at Context.<anonymous> (/code/tests/test/pages/login.page.js:20:18) at Promise.F (/code/tests/node_modules/core-js/library/modules/_export.js:35:28) 替换为其功能以使代码进展时,this.open();也会出现错误:

this.login();

我想我可以看到1) Navigation bar when logged in "before all" hook: this.login is not a function running chrome TypeError: this.login is not a function at Context.<anonymous> (/code/tests/test/pages/login.page.js:24:18) at Promise.F (/code/tests/node_modules/core-js/library/modules/_export.js:35:28) 在传递给this的属性配置对象中没有多大意义,但我不确定你是怎么做的 - {{{ 3}}甚至没有引用以这种方式工作的例子。

编辑:这与建议的重复问题不同:documentation for Object.defineProperties - 我正在讨论在创建对象时引用对象的变量属性,因为变量是相互构建的。建议的副本通常与Object.create讨论JavaScript范围问题 - 这个特定的问题更加集中,更多的是关于如何在完全创建该对象之前使用该对象的其他属性构建对象的属性。

0 个答案:

没有答案