解new操作符后大家应该已经知道,必须有一个构造器才能执行new操作。所以比单实例要多了一个过程,就是要创建构造器,下面我把步骤给贴出来。
3.添加MultiObject.idl文件
6.添加 JSMultiObjectConstructor.cpp
7.修改JSDOMWindowCustom.cpp
以MultiObject为例。
1.添加MultiObject.h文件
- #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文件
- #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!";
- }
- }
- module window {
- interface [
- CustomConstructor
- ] MultiObject{
- readonly attribute DOMString description;
- };
- }
4.修改DOMWindow.idl文件
添加声明如下:
- attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;
5.添加JSMultiObjectConstructor.h
- #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__
- #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
- #include "JSMultiObjectConstructor.h"
- JSValue JSDOMWindow::multiObject(ExecState* exec) const
- {
- return getDOMConstructor<JSMultiObjectConstructor>(exec, this);
- }