我对javascript中的以下代码感到困惑。
var x=(function(){
var customObject = function(){};
customObject.prototype.sayHello=function(){
alert("hello");
};
return customObject;
})();
//var y=new x();// If I uncomment this line and comment the next line "var
//y=x;" the code works
var y=x;
y.sayHello();
这段代码没有问好,但是当我删除评论时它会这样做。我读到IIFE在定义后立即执行。因此,它应该直接将customObject分配给x。
我的问题是为什么我需要创建一个x的新实例来打招呼。我不清楚IIFE是如何在这里工作的。
请帮助我理解这个概念。先感谢您 :-) 。
答案 0 :(得分:3)
您将x
分配给customObject
是正确的。但是x
(因此sayHello
)没有prototype
属性。它具有sayHello
属性,而 具有y=x
属性。
当您执行y.sayHello()
然后customObject.sayHello
时,您正在尝试拨打不存在的y=new x()
。
执行customObject.prototype
时,创建一个原型为y.sayHello()
对象的对象。然后,当您致电sayHello
时,会通过原型链找到var x = function() {}
x.prototype.sayHello = function() {
alert("hello");
}
函数。
这与您使用IIFE无关。如果您刚写完:
,您会得到相同的结果{{1}}
而不是IIFE。
答案 1 :(得分:1)
好的,我在这里感到困惑。
首先,IIFE正在这里正确地开展工作。它执行并将customObject
返回到变量x
这就是应该做的。
现在回答你的实际问题, 为什么我需要创建一个新的x实例来表示你好 ?
您可能已阅读,所有classes(functions)
都有prototype
,所有variables
都有__proto__
属性。
原型上设置的任何内容都可以被该构造函数的实例访问。
例如:
var myName = "apl"; // a simple string
console.log(myName.toUpperCase()) // outputs: APL
您认为我们如何在变量名称上调用toUpperCase()
?
我们可以,因为typeof(myName )
原来是string
。因此,myName
可以调用String.prototype
上设置的任何属性/方法。
简而言之,__proto__
上的myName
属性应设置为字符串的prototype
即myName.__proto__ === String.prototype
// true,因为myName是String
因此,在您的情况下,您需要y
作为x
的实例。只有这样,您才能访问x
原型上设置的方法,而customObject.prototype
原型又import tensorflow as tf
import numpy as np
I = [1, 0, 2, 3, 0, 1, 1]
K = [2, 1, 3]
i = tf.constant(I, dtype=tf.float32, name='i')
k = tf.constant(K, dtype=tf.float32, name='k')
data = tf.reshape(i, [1, int(i.shape[0]), 1], name='data')
kernel = tf.reshape(k, [int(k.shape[0]), 1, 1], name='kernel')
res = tf.squeeze(tf.nn.conv1d(data, kernel, 1, 'VALID'))
with tf.Session() as sess:
print sess.run(res)
print np.convolve(I, K[::-1], 'VALID')