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

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

#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 WebCore
7.修改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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: