您的位置:首页 > Web前端 > JavaScript

webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)

2011-12-07 20:24 645 查看
今天刚好有时间,把创建多实例对象的方法写一下,也就是可以像new Date()一样。关于new操作符有一篇讲的很详细,大家可以先看下http://www.pushiming.com/blog/2009/10/the-new-operator/

了解new操作符后大家应该已经知道,必须有一个构造器才能执行new操作。所以比单实例要多了一个过程,就是要创建构造器,下面我把步骤给贴出来。

以MultiObject为例。

1.添加MultiObject.h文件

view
plain

#ifndef MultiObject_h

#define MultiObject_h

#include <wtf/PassRefPtr.h>

#include <wtf/RefCounted.h>

#include <wtf/RefPtr.h>

namespace WebCore {

class Frame;

class String;

class MultiObject : public RefCounted<MultiObject> {

public:

static PassRefPtr<MultiObject> create(Frame* frame)

{

return adoptRef(new MultiObject(frame));

}

~MultiObject();

void disconnectFrame();

Frame* frame() const { return m_frame; }

String description() const;

private:

MultiObject(Frame*);

Frame* m_frame;

};

}

#endif

2.添加MultiObject.cpp文件

view
plain

#include "MultiObject.h"

#include "PlatformString.h"

#include "Frame.h"

#include "Page.h"

#include "RangerIFrameWidget.h"

#include "config.h"

namespace WebCore {

MultiObject::MultiObject(Frame* frame)

: m_frame(frame)

{

}

MultiObject::~MultiObject()

{

disconnectFrame();

}

void MultiObject::disconnectFrame()

{

m_frame = 0;

}

String MultiObject::description() const //对象的属性

{

return "Hello World!";

}

}

3.添加MultiObject.idl文件

view
plain

module window {

interface [

CustomConstructor

] MultiObject{

readonly attribute DOMString description;

};

}

4.修改DOMWindow.h文件

添加声明如下:

view
plain

attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;

WebCore/bindings/js

5.添加JSMultiObjectConstructor.h

view
plain

#ifndef __JSMultiObjectConstructor_h__

#define __JSMultiObjectConstructor_h__

#include "JSDOMBinding.h"

namespace WebCore {

class JSMultiObjectConstructor : public DOMConstructorObject {

public:

JSMultiObjectConstructor(JSC::ExecState*, JSDOMGlobalObject*);

static const JSC::ClassInfo s_info;

private:

virtual JSC::ConstructType getConstructData(JSC::ConstructData&);

virtual const JSC::ClassInfo* classInfo() const { return &s_info; }

};

} // namespace WebCore

#endif//__JSMultiObjectConstructor_h__

6.添加JSMultiObjectConstructor.cpp

view
plain

#include "config.h"

#include "JSMultiObjectConstructor.h"

#include "JSMultiObject.h"

#include "ScriptExecutionContext.h"

#include "MultiObject.h"

#include <runtime/Error.h>

#include "JSDOMWindowBase.h"

using namespace JSC;

namespace WebCore {

ASSERT_CLASS_FITS_IN_CELL(JSMultiObjectConstructor);

const ClassInfo JSMultiObjectConstructor::s_info = { "MultiObjectConstructor", 0, 0, 0 };

JSMultiObjectConstructor::JSMultiObjectConstructor(ExecState* exec, JSDOMGlobalObject* globalObject)

: DOMConstructorObject(JSMultiObjectConstructor::createStructure(globalObject->objectPrototype()), globalObject)

{

putDirect(exec->propertyNames().prototype, JSMultiObjectPrototype::self(exec, globalObject), None);

}

static JSObject* constructMultiObject(ExecState* exec, JSObject* constructor, const ArgList&)

{

JSMultiObjectConstructor* jsConstructor = static_cast<JSMultiObjectConstructor*>(constructor);

JSDOMWindowBase* window = static_cast<JSDOMWindowBase*>(jsConstructor->globalObject());

if (!window || !window->impl() || !window->impl()->frame())

return Error::create(exec, ReferenceError, "Can not create MultiObject...", -1, -1, UString());

RefPtr<MultiObject> MultiObject = MultiObject::create(window->impl()->frame());

if (!MultiObject.get())

return Error::create(exec, ReferenceError, "Not support MultiObject...", -1, -1, UString());

return CREATE_DOM_OBJECT_WRAPPER(exec, jsConstructor->globalObject(), MultiObject, MultiObject.get());

}

ConstructType JSMultiObjectConstructor::getConstructData(ConstructData& constructData)

{

constructData.native.function = constructMultiObject;

return ConstructTypeHost;

}

} // namespace WebCore

7.修改JSDOMWindowCustom.cpp

view
plain

#include "JSMultiObjectConstructor.h"

JSValue JSDOMWindow::multiObject(ExecState* exec) const

{

return getDOMConstructor<JSMultiObjectConstructor>(exec, this);

}

OK,再修改相应的CMakeLists.txt就行了。

注意:头文件包含依据自己的项目。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息