我正在使用SharePoint 2010.在Internet Explorer中运行我的SharePoint webpart(我正在使用IE版本11 )时,下面的方法应该获取字符串值并在警报消息中显示值,而不是显示错误“对象不支持此操作”。它停在Object.defineProperty本身。此错误仅在IE中发生。编码如下:
var obj = {
name: 'abcd'
}
Object.defineProperty(obj, "Name", {
get: function () { return this.name; }
});
alert(obj.Name);
需要知道为什么会发生这种错误以及如何修复它?
答案 0 :(得分:1)
为什么会这样?
这是因为SharePoint 2010在Internet Explorer中以兼容模式运行,以确保所有加载项都能正常工作。兼容模式模拟Internet Explorer 8,它尚未引入对Object.defineProperty
的支持。
你能做些什么?
您可以更新相关母版页以强制浏览器在边缘模式下呈现,但这可能会导致内置SharePoint功能出现不受欢迎的问题。
最佳路线是在代码调用之前检查Object.defineProperty
是否存在,并在不可用时使用其他方法。
以下是两种替代方法,但我确定还有其他方法:
使用对象构造函数定义访问器/增变器函数
将对象定义为构造函数时,只能使用this
关键字定义的变量作为从该构造函数创建的对象的公共成员。使用var
关键字定义的任何变量都将被处理掉,除非它们被构造函数中的任何函数引用,在这种情况下,它们的引用将由闭包保留,允许它们像私有成员一样行动。 / p>
var person = function(first,last){
var firstname = first || "Bob"; // private member
var lastname = last || "Smith"; // private member
this.getName = getFullName; // public member
function getFullName(){
return firstname + " " + lastname;
}
}
var john = new person("John","Deere");
alert(john.getName()); // "John Deere"
alert(john.firstname); // undefined
这有一些非常大的缺点,其中最明显的一点是,您使用构造函数创建的每个对象都会在内存中复制到构造函数中的函数定义。
输入原型方法......
使用对象原型将函数定义附加到对象类
更友好的方法是只在构造函数中定义变量,然后将任何必要的成员函数附加到对象原型,这样无论你创建多少个实例,函数都只定义一次。
这种方法的缺点是在构造函数之外定义的函数不能访问" private"在其范围内定义的变量,因此您必须使用this
关键字对它们进行全部定义。
var person = function(first,last){
this.firstname = first || "Bob"; // public member
this.lastname = last || "Smith"; // public member
}
// attach the getName() function to the prototype:
person.prototype.getName = function(){
return this.firstname + " " + this.lastname;
}
var jane = new person("Jane","Doe");
alert(jane.getName()); // "Jane Doe"
alert(jane.firstname); // "Jane";