js多对象扩展
2012-02-08 16:32
218 查看
解new操作符后大家应该已经知道,必须有一个构造器才能执行new操作。所以比单实例要多了一个过程,就是要创建构造器,下面我把步骤给贴出来。
以MultiObject为例。
1.添加MultiObject.h文件
[cpp]
view plaincopyprint?
#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文件
[cpp]
view plaincopyprint?
#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!";
}
}
[cpp]
view plaincopyprint?
module window {
interface [
CustomConstructor
] MultiObject{
readonly attribute DOMString description;
};
}
4.修改DOMWindow.idl文件
添加声明如下:
[cpp]
view plaincopyprint?
attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;
WebCore/bindings/js
5.添加JSMultiObjectConstructor.h
[cpp]
view plaincopyprint?
#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__
[cpp]
view plaincopyprint?
#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
[cpp]
view plaincopyprint?
#include "JSMultiObjectConstructor.h"
JSValue JSDOMWindow::multiObject(ExecState* exec) const
{
return getDOMConstructor<JSMultiObjectConstructor>(exec, this);
}
以MultiObject为例。
1.添加MultiObject.h文件
[cpp]
view plaincopyprint?
#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
#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文件
[cpp]
view plaincopyprint?
#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!";
}
}
#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文件
[cpp]
view plaincopyprint?
module window {
interface [
CustomConstructor
] MultiObject{
readonly attribute DOMString description;
};
}
module window { interface [ CustomConstructor ] MultiObject{ readonly attribute DOMString description; }; }
4.修改DOMWindow.idl文件
添加声明如下:
[cpp]
view plaincopyprint?
attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;
attribute [JSCCustomGetter] MultiObjectConstructor MultiObject;
WebCore/bindings/js
5.添加JSMultiObjectConstructor.h
[cpp]
view plaincopyprint?
#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__
#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
[cpp]
view plaincopyprint?
#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 "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 WebCore7.修改JSDOMWindowCustom.cpp
[cpp]
view plaincopyprint?
#include "JSMultiObjectConstructor.h"
JSValue JSDOMWindow::multiObject(ExecState* exec) const
{
return getDOMConstructor<JSMultiObjectConstructor>(exec, this);
}
#include "JSMultiObjectConstructor.h" JSValue JSDOMWindow::multiObject(ExecState* exec) const { return getDOMConstructor<JSMultiObjectConstructor>(exec, this); }
相关文章推荐
- JS中禁止对象属性扩展、密封对象、冻结对象
- webkit的js对象扩展(一)——binding方式创建自定义对象(单实例)
- 扩展js原生对象的正确姿势
- JS常用扩展内建对象
- JS中禁止对象属性扩展、密封对象、冻结对象
- 扩展JS Date对象时间格式化功能
- webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)
- Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示
- js扩展Date对象 日期格式化
- webkit的js对象扩展(二)——binding方式创建自定义对象(多实例)
- JS进阶篇--IE浏览器的ActiveXObject对象以及FileSystemobject的应用扩展(完成)
- JS 对象之扩展、密封、冻结三大特性
- JS中禁止对象属性扩展、密封对象、冻结对象
- Arcgis for JS扩展GraphicLayer实现区域对象的聚类统计与展示
- 扩展JS Date对象时间格式化功能的小例子
- js-es6-对象扩展
- 为JS的Date对象扩展几个好用的prototype函数(加上若干个月、等)
- js对象深拷贝和对象扩展
- js-ES6学习笔记-对象的扩展
- js框架设计1.2对象扩展笔记