我正在尝试使用PHP IteratorAggregate,但没有太多运气.实现IteratorAggregate的对象具有属性$ items,它是一个对象My_Object的数组.
当用户使用带有My_Collection实例的foreach语句时,我希望它迭代$ items数组......但是下面的代码似乎没有按预期工作.
class My_Object {
public $value;
public function __construct( $value ) {
$this->value = $value;
}
}
class My_Collection implements IteratorAggregate {
protected $items = array();
public function add_item( $value ) {
array_push( $this->items, new My_Object( $value ) );
}
public function getIterator() {
return $this->items;
}
}
$my_collection = new My_Collection();
$my_collection->add_item( 1 );
$my_collection->add_item( 2 );
$my_collection->add_item( 3 );
foreach( $my_collection as $mine ) {
echo( "<p>$mine->value</p>" );
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
<b>Fatal error</b>: Uncaught exception …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关如何在窗口调整大小完成后触发函数的帖子,并且遇到了一些将自动执行匿名函数分配给变量的示例:
var delay = (function(){
var timer = 0;
return function(callback, ms){
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
$(window).resize(function() {
delay(function(){
alert('Resize...');
//...
}, 500);
});
Run Code Online (Sandbox Code Playgroud)
与传统用法相比,使函数操作数自行执行有什么区别/好处?即
var delay = function() { ...
Run Code Online (Sandbox Code Playgroud) 我试图找出如何从另一个实例化的对象实例化一个新对象,而无需使用new运算符.以下代码有效,但我听说__proto__属性已折旧.
var MyObject = function( arg ) {
this.value = arg;
};
MyObject.prototype.getValue = function() {
return this.value;
};
// Standard way of instantiating an object
var object1 = new MyObject( 'foo' );
// Creating new object based on another without using new operator
var object2 = {};
object2.__proto__ = object1.__proto__
object1.constructor.call( object2, 'bar' );
console.log( object1 );
console.log( object2 );
Run Code Online (Sandbox Code Playgroud)
那么如果没有__proto__属性我该如何做呢?
OOP建议只公开您希望用户能够访问的变量和方法.我一直在为我的对象使用公共方法声明(即原型).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
// draw logic here
}
DrawShape.prototype.square = function() {
// draw logic here
}
Run Code Online (Sandbox Code Playgroud)
这种方法似乎是最有效的,因为每次实例化实例时都不会重写该方法.但是我发现要创建好的DRY,模块化代码我必须创建仅供其他方法访问的方法(即私有方法).
DrawShape = function() {
}
DrawShape.prototype.circle = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.square = function() {
var colour = this.setColour();
// draw logic here
}
DrawShape.prototype.setColour = function() {
return "blue";
}
Run Code Online (Sandbox Code Playgroud)
在这里,我创建了一个名为setColour的方法,该方法仅用于由其他方法运行.问题是该方法是公开的,可以被任何人或任何人调用.
我可以将方法移动到对象构造函数中...但这意味着我不再保存内存(即每次实例化实例时都会重写),这也意味着我必须移动所有其他方法进入构造函数.
在创建对象时,JavaScript中的最佳实践是什么?
编写一个小方法,我希望既可以作为对象中的方法,也可以从原型中静态运行.
这是一个例子:
function Obj() {}
Obj.prototype.func = function() {
if( this.instantiated ) { // Yes I know this is not valid code!
// instantiated code here
} else {
// instantiated code here
}
};
var myObj = new Obj();
myObj.func();
Obj.prototype.func();
Run Code Online (Sandbox Code Playgroud)
如何判断此变量是来自实例还是来自类?
我试图找出如何测试变量是否是特定绑定函数的实例.请考虑以下示例:
var func = function( arg ) {
// code here
}
myFunc = func.bind( null, 'val' );
if( myFunc == func ) {
console.log( true );
} else {
console.log( false );
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这导致错误.是否有某种方法来测试变量以找出它绑定的函数?
我一直在试图找出更多关于鼠标事件,例如onmouseover,onmouseout和onmousemove,但没有太多的信息。默认情况下,这些事件处理程序似乎只有一个参数,即事件本身。
element.onmouseover = mouseoverFunction
function mouseoverFunction( event ) {
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)
但是我希望能够将其他参数传递给函数。
function mouseoverFunction( event, moreArgs ) {
// Do stuff here
}
Run Code Online (Sandbox Code Playgroud)
如何将事件参数和附加参数传递给函数?
还可以将更多参数传递给事件处理函数吗?
我有一个看起来像这样的表:
| A | B | C | D |
+-------+------------+------------+------------+
1 | Name | Language 1 | Language 2 | Language 3 |
+=======+============+============+============+
2 | John | English | Chinese | Spanish |
3 | Wendy | Chinese | French | English |
4 | Peter | Spanish | Chinese | English |
Run Code Online (Sandbox Code Playgroud)
我想生成一个只有一种语言列的表。另外两个语言列应成为新行,如下所示:
| A | B |
+-------+----------+
1 | Name | Language |
+=======+==========+
2 | John | English |
3 | John | Chinese …Run Code Online (Sandbox Code Playgroud)