我是JavaScript的新手,并试图理解我应该如何编写类(我的背景是'常规'OO语言,例如java和c ++).
我知道我有两个选择:
如果我希望我的类有私有方法和成员,我无法在原型中定义它们.但在这种情况下,它们将为每个创建的新对象(内存问题)构建.
如果我在类原型中定义方法,我将没有封装(这对我来说很奇怪,作为java/c ++开发人员:P).
您使用哪两种方法?为什么?
基于类的继承显示了它在创建大型编程系统(尤其是GUI系统)时的实用性.
如何在现实生活中应用基于原型的继承?我们应该如何构建系统而不是创建类层次结构?
这里是否存在基于类的OOP存在的基于真实原型的OOP的编程模式?
javascript inheritance design-patterns prototypal-inheritance prototype-programming
我正在尝试创建一个主对象,我可以创建多个实例,每个实例都继承子项(具有唯一/隔离属性).但是,当我这样做时,对象的属性(在被更改之后)正在改变所有创建的对象.我可能没有正确解释这个,但这个例子应该很清楚.
Main = function(){};
// Extending the main class with new object. Doing it this way so I can have these in
// separate files.
Main.prototype.foo = {
bar: 1
}
// First instance of Main().
var A = new Main();
// Second instance of Main().
var B = new Main();
// Set the bar property to different values for each Main() object.
A.foo.bar = 2;
B.foo.bar = 3;
// Both A.foo.bar and B.foo.bar return 3.
alert(A.foo.bar);
alert(B.foo.bar);
Run Code Online (Sandbox Code Playgroud)
我想要发生的是A.foo.bar返回2和B.foo.bar返回3,这样我就有了彼此独立的孤立对象.
有任何想法吗?我只是错过了一些明显的东西吗?非常感谢!
function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false
Run Code Online (Sandbox Code Playgroud) Sqlite FT3 或 FT4 可以做类似的事情吗
SELECT * FROM MyTable WHERE body MATCH '*qlite'
Run Code Online (Sandbox Code Playgroud)
我知道这个:
SELECT * FROM MyTable WHERE body MATCH 'Sqlite*'
Run Code Online (Sandbox Code Playgroud)
工作,但似乎'%like'操作在全文中不起作用。
我试图使用原型以这种方式触发onScroll事件:
Event.observe(document, 'scroll', function(){
alert('boo');
});
Run Code Online (Sandbox Code Playgroud)
它在Firefox上完美运行,但在IE上没有任何反应.有谁知道为什么?如果有另一种方法可以这样做?
谢谢
我正在尝试为该innerHTML属性定义自定义setter .不幸的是,我在定义setter函数后无法访问底层属性:
$('body')[0].__defineSetter__("innerHTML",
function (val) {
alert("Setting to: " + val);
this.innerHTML = val;
});
Run Code Online (Sandbox Code Playgroud)
此片段填充调用堆栈,因为赋值以递归方式调用setter.Apparenly innerHTML已经是IE8中的重载属性,你可以简单地保存旧的get/set对并在新的属性描述符中使用它.摘自MSDN:
var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML');
Object.defineProperty(Element.prototype, 'innerHTML',
{ set: function(htmlVal) {
var safeHTML = toStaticHTML(htmlVal);
innerHTMLdescriptor.set.call(this, safeHTML);
}
});
Run Code Online (Sandbox Code Playgroud)
但是,Chrome的情况似乎并非如此,其中getOwnPropertyDescriptor返回未定义innerHTML.在这种情况下,我如何访问底层属性?
奖金问题:我如何确保将来创建的所有对象都有这种特殊innerHTML行为?是否可以使用DOM原型?似乎重载函数不是我需要的.也许有可能重载DOM构造函数并添加一个调用,__defineGetter__/defineProperty但看起来对构造函数的支持并不常见,所以我想知道是否有任何替代方法.
这些天我的大部分工作都与js开发有关.
但是我突然发现我对一些问题感到困惑.
检查此代码(我向自定义类添加一个方法):
MyCustomClass.prototype.fun=function(xx){
this.options={.....}
function innerFun01(){}
function innerFun02(){}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用它.
var mcc=new MyCustomClass();
mcc.fun(xxxx);
var mcc2=new MyCustomClass();
mcc2.fun(xxxx);
Run Code Online (Sandbox Code Playgroud)
现在,我想知道在内存中会创建多少个"innerFun01"和"innerFun02"函数的副本?
我真的很困惑.
我正在读这本书,有一章关于原型,有这个难以理解的段落和代码片段.
创建新对象时,可以选择应该是其原型的对象.JavaScript提供的机制是混乱和复杂的,但它可以大大简化.我们将向Object函数添加一个beget方法.beget方法创建一个使用旧对象作为其原型的新对象.
if (typeof Object.beget !== 'function') {
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
var another_stooge = Object.beget(stooge);
Run Code Online (Sandbox Code Playgroud)
你能解释一下这段代码,为什么这么好?等等?您会建议哪种资源来研究原型?这是非常困难的.
我的软件的一些用户最近来找我,告诉我它在Windows 8上不起作用.经过调查后发现,由于一些奇怪的原因,我的服务器套接字并不总是接受连接,但让它们超时.
更奇怪的是:连接到localhost时也会发生这种情况,而不仅仅是在远程访问时.
"你试过什么?"
提醒:完全相同的代码在Windows XP和Windows 7上运行正常,它也会影响localhost连接(不是硬件问题).此外,只有三分之一的连接失败,其余的工作正常.
好的,现在是一些真正的代码,因为它比所有这些单词更有用.
套接字设置:
int iResult;
struct addrinfo *result = NULL;
struct addrinfo hints;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
// "Resolve" our localhost
iResult = getaddrinfo(NULL, port, &hints, &result);
if (iResult != 0) {
printf("error (2) : %d\n", iResult);
return false;
}
// Create the socket
listenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
if (listenSocket == INVALID_SOCKET) {
freeaddrinfo(result);
printf("error (3) : %d\n", WSAGetLastError());
return false; …Run Code Online (Sandbox Code Playgroud) javascript ×8
prototypejs ×2
c++ ×1
constructor ×1
dom ×1
inheritance ×1
innerhtml ×1
sockets ×1
sqlite ×1
windows-8 ×1