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就行了。
注意:头文件包含依据自己的项目。
了解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就行了。
注意:头文件包含依据自己的项目。
相关文章推荐
- webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)
- webkit的js对象扩展(一)——binding方式创建自定义对象(单实例)
- webkit的js对象扩展(一)——binding方式创建自定义对象(单实例)
- webkit js扩展方式之Binding添加新DOM对象
- js----自定义对象的四种创建方式
- JS中new的自定义实现创建实例对象
- js创建自定义对象的几种方式
- js几种创建对象方式及比较
- js中创建对象三种方式
- js创建对象的方式
- 【COCOS2DX-LUA 脚本开发之五】Lua 使用OOP(面对对象思想编程),免Binding创建自定义lua类
- javascript中的创建自定义对象的六种方式详解
- js面向对象基本理解和三种创建方式
- JS创建对象的7中方式
- javascript(js)创建对象的模式与继承的几种方式
- js创建对象的6种方式
- 对JS关于对象创建的几种方式的整理
- js使用函数创建对象的方式
- js中创建对象的三种方式
- winform自定义组件创建失败——未将对象设置引用到实例