Javascript 如何创建一个WinJS.Class

Javascript 如何创建一个WinJS.Class,javascript,windows-8,windows-store-apps,winjs,Javascript,Windows 8,Windows Store Apps,Winjs,我正在序列化并存储从WinJS.Class创建的对象,如下所示: var myClass = WinJS.Class.define(...); var myObject = new myClass(); var serialized = JSON.stringify(myObject); //store the object // MovieModel Methods // ------------------ var movieModelMethods = { title: {

我正在序列化并存储从WinJS.Class创建的对象,如下所示:

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object
// MovieModel Methods
// ------------------
var movieModelMethods = {
    title: {
        get: function () {
            return this._titleValue;
        },
        set: function (val) {
            this._titleValue = val;
            this.dispatchEvent("title");
        }
    }
};
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}
然后我将对象从存储中取出,我想反序列化它并将其转换为myClass。WinJS开箱即用是可能的,还是我需要为我的类创建一个构造函数,该构造函数能够将一个对象转换为一个新对象


我还没有深入研究TypeScript,我认为这在这种情况下会有所帮助,但在此之前,我一直想知道如何使用纯JavaScript/WinJS来实现这一点。

您应该能够在将JSON.parse从本地存储中取出后调用它:

肌对象2;
myObject2=JSON.parselocalStorage[mySerizliedObject]

从本地存储中取出JSON.parse后,您应该能够调用它:

肌对象2;
myObject2=JSON.parselocalStorage[mySerizliedObject]

Javascript是一种动态语言,因此我认为您不需要强制转换反序列化对象,只需将其视为myClass类型即可。希望它能对您有所帮助。

Javascript是一种动态语言,因此我认为您不需要强制转换反序列化对象,只需将其视为myClass类型即可。希望它对你有帮助。

你应该考虑使用“选项”构造函数模式,其中选项值是反序列化对象:

// MovieModel Constructor
// ----------------------
function MovieModel(options) {
    this._titleValue = options.title || "Sample Title";
}
电影方法闭包是这样的:

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object
// MovieModel Methods
// ------------------
var movieModelMethods = {
    title: {
        get: function () {
            return this._titleValue;
        },
        set: function (val) {
            this._titleValue = val;
            this.dispatchEvent("title");
        }
    }
};
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}

您应该考虑使用“选项”构造函数模式,其中选项值是反序列化对象:

// MovieModel Constructor
// ----------------------
function MovieModel(options) {
    this._titleValue = options.title || "Sample Title";
}
电影方法闭包是这样的:

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object
// MovieModel Methods
// ------------------
var movieModelMethods = {
    title: {
        get: function () {
            return this._titleValue;
        },
        set: function (val) {
            this._titleValue = val;
            this.dispatchEvent("title");
        }
    }
};
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}

因为据我所知,WinJS类define只能指定一个构造函数,所以可以使用静态成员定义一个工厂函数,该工厂函数将序列化数据作为参数。这个工厂将实际创建一个新实例,并逐个设置值并返回新对象

它具有一些优点,例如,在增强应用程序的过程中,您可以实际管理数据结构的更改。。。 缺点是您不能一直编写新的MySuperClass

...
// let's suppose we already called JSON.parse(data);
create: function(serializedData) {
    var newObj = new MySuperClass();
    newObj.name = serializedData.name || "";
    newObj.color = serializedData.color || "";
    return newObj;
}
然后,您将调用应用程序中的其他位置:

var myInstance = MySuperClass.create(serializedDataFromfile);

因为据我所知,WinJS类define只能指定一个构造函数,所以可以使用静态成员定义一个工厂函数,该工厂函数将序列化数据作为参数。这个工厂将实际创建一个新实例,并逐个设置值并返回新对象

它具有一些优点,例如,在增强应用程序的过程中,您可以实际管理数据结构的更改。。。 缺点是您不能一直编写新的MySuperClass

...
// let's suppose we already called JSON.parse(data);
create: function(serializedData) {
    var newObj = new MySuperClass();
    newObj.name = serializedData.name || "";
    newObj.color = serializedData.color || "";
    return newObj;
}
然后,您将调用应用程序中的其他位置:

var myInstance = MySuperClass.create(serializedDataFromfile);

有几种方法可以处理这个问题,没有一种方法对WinJS特别有用。简而言之:JSON序列化仅序列化和反序列化obje值,而不是其方法、原型或其他类型信息

选项1:将值复制到类的新实例 这通常通过让构造函数将反序列化对象作为参数并将数据复制到新实例来实现

这有各种各样的变化。使用对象构造函数通常对性能最好,因为这通常使JS引擎能够对对象应用更多的优化

WinJS.UI.setOptions在这里很有用,或者您可以使用如下简单循环复制数据:

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object
// MovieModel Methods
// ------------------
var movieModelMethods = {
    title: {
        get: function () {
            return this._titleValue;
        },
        set: function (val) {
            this._titleValue = val;
            this.dispatchEvent("title");
        }
    }
};
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}
请注意,setPrototypeOf相对较新。它在Win8.1上用于web应用程序,我猜这是关于IE 11中的,但在Safari中不可用。在较旧的浏览器/Safari上,分配给proto是等效的,但如果可用,setPrototypeOf更好

这会将myClass中的方法附加到对象,但除了负面的性能影响外,还不会在对象上运行构造函数-因此它可能仍然与最初序列化的对象处于不同的状态

其他有用的东西:JSON恢复器
parse接受可选的第二个参数,称为恢复器。这允许您提供一个函数,该函数有机会转换被反序列化的JSON的每个节点。例如,这对于将序列化日期重新水化为JavaScript日期对象非常有用。它还可以转换最顶层的对象,在某些情况下,这对于将反序列化对象转换为所需的类非常有用。

有几种方法可以处理此问题,没有一种方法对WinJS特别有用。简而言之:JSON序列化仅序列化和反序列化obje值,而不是其方法、原型或其他类型信息

选项1:将值复制到类的新实例 这通常通过让构造函数将反序列化对象作为参数并将数据复制到新实例来实现

有各种各样的变化 这使用对象构造函数通常对性能最好,因为这通常使JS引擎能够对对象应用更多的优化

WinJS.UI.setOptions在这里很有用,或者您可以使用如下简单循环复制数据:

var myClass = WinJS.Class.define(...);
var myObject = new myClass();
var serialized = JSON.stringify(myObject);
//store the object
// MovieModel Methods
// ------------------
var movieModelMethods = {
    title: {
        get: function () {
            return this._titleValue;
        },
        set: function (val) {
            this._titleValue = val;
            this.dispatchEvent("title");
        }
    }
};
var keys = Object.keys(source);
for (var i = 0, len = keys.length; i < len; i++) {
    var key = keys[i];
    destination[key] = source[key];
}
请注意,setPrototypeOf相对较新。它在Win8.1上用于web应用程序,我猜这是关于IE 11中的,但在Safari中不可用。在较旧的浏览器/Safari上,分配给proto是等效的,但如果可用,setPrototypeOf更好

这会将myClass中的方法附加到对象,但除了负面的性能影响外,还不会在对象上运行构造函数-因此它可能仍然与最初序列化的对象处于不同的状态

其他有用的东西:JSON恢复器
parse接受可选的第二个参数,称为恢复器。这允许您提供一个函数,该函数有机会转换被反序列化的JSON的每个节点。例如,这对于将序列化日期重新水化为JavaScript日期对象非常有用。它还可以转换最顶层的对象,在某些情况下,这对于将反序列化对象转换为所需的类很有用。

WinJS和typescript都不起作用。JSONing过程将从实例中提取函数和原型链。您需要手动在另一侧重建它们。WinJS和typescript都不起作用。JSONing过程将从实例中提取函数和原型链。您需要手动重新构建它们。正如Dominic在上面指出的,这不会为您提供任何函数,只提供属性。正如Dominic在上面指出的,这不会为您提供任何函数,只提供属性。对于这种模式,WinJS提供了setOptions帮助器,这基本上是一种简单的属性复制机制,用于将属性从选项复制到此模式。对于此模式,WinJS提供了setOptions助手,这基本上是一种简单的属性复制机制,用于将属性从选项复制到此模式。