我有一个方法可以让我在创建新对象时选择原型(prototype)对象(从“Javascript:The Good Parts”一书复制):
Object.create = function(o) {
var F = function() {};
F.prototype=o;
return new F();
}
现在说,我有一个对象:
var car = {
model: "Nissan"
};
然后我使用“Create”方法基于这个对象创建了一个新对象:
var car1 = Object.create(car);
然后我可以向 car 添加一个属性,它会动态地添加到 car1(动态原型(prototype))。例如:
car.year=2011; // Gets added to "car"...
alert(car1.year); // ... Is also avaialable to car1
Q1) 此行为表明“year”已添加到汽车的原型(prototype)中,这就是它对 car1 可用的原因。这样对吗?如果不是,那么“year”在哪里添加,为什么它对“car”和“car1”都可用?
此外,根据委托(delegate)规则,如果在对象上找不到方法,它将搜索其原型(prototype),然后检查链上的所有原型(prototype),直到到达 Object.prototype。所以现在,如果我输入如下内容:
Object.prototype.originCountry = "Japan";
alert(car.originCountry); // Outputs Japan
alert(car1.originCountry); // Outputs Japan
到目前为止一切顺利;但是,如果我这样做:
Object.carColor= "White";
alert(car.carColor); // Error!
Q2) 当我向“汽车”添加一个属性时(参见上面的 car.year 示例,它被添加到汽车的原型(prototype)中。但是,当我向对象添加一个属性时,它没有被添加到 Object 的原型(prototype)中?如果它确实被添加到 Object 的原型(prototype)中,那么根据委托(delegate)规则,为什么它对“汽车”不可用?
为什么会这样?
最佳答案
当你这样做时:
Object.carColor = "White";
然后属性 carColor 不会添加到 Object 的原型(prototype)中。它现在是 Object 的一个属性。要查看您的期望,您要做的是:
Object.prototype.carColor = "White";
之后:
alert(({}).carColor); // Will alert "White"
那么这里发生的事情就是这样。创建的任何对象,包括 {}(它不过是一个空对象)都是 Object 的新实例,因此共享 原型(prototype)中设置的任何属性>对象。
至于您的Object.create 函数是如何工作的。让我们逐行看一下:
1. var F = function() {};
您只需创建一个新函数,一个本质上是空白的对象。您使用函数而不是 {} 之类的东西的原因是因为函数可以与 new 调用相结合,以创建该对象的新实例,其中该函数将起作用作为构造函数。
2. F.prototype=o;
您将新空白函数的原型(prototype)设置为您创建的对象。现在,这纯粹是一个引用。它不是深拷贝。我的意思是,当对象 o 发生变化时,对象的任何实例也会发生变化(实际上它们不会发生变化,但它们“似乎”会发生变化。稍后会详细介绍)。
3. return new F();
现在您只需创建该函数的一个新实例,它有一个原型(prototype)作为您传递的对象。
当您执行以下操作时:
var car1 = Object.create(car);
你得到一个对象car1,它的原型(prototype)是car。所以当你这样做时:
car.year = 2011
这不像 car1 变化。它更像是原型(prototype)所指的对象发生了变化。所以当你做类似的事情时:
car1.year
搜索(首先在原型(prototype)中,然后在对象中)名为 year 的属性,结果是原型(prototype)具有它,因此 car1.year 将返回 2011。
所以底线是这样的:
Object 的属性不会体现在任何实例更改中。关于Javascript 原型(prototype)行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328593/
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
我有这个:AccountSummary我想单击该链接,但在使用link_to时出现错误。我试过:bot.click(page.link_with(:href=>/menu_home/))bot.click(page.link_with(:class=>'top_level_active'))bot.click(page.link_with(:href=>/AccountSummary/))我得到的错误是:NoMethodError:nil:NilClass的未定义方法“[]” 最佳答案 那是一个javascript链接。Mechan
defreverse(ary)result=[]forresult[0,0]inaryendresultendassert_equal["baz","bar","foo"],reverse(["foo","bar","baz"])这行得通,我想了解原因。有什么解释吗? 最佳答案 如果我使用each而不是for/in重写它,它看起来像这样:defreverse(ary)result=[]#forresult[0,0]inaryary.eachdo|item|result[0,0]=itemendresultendforainb基本上就
以下测试中的第3个失败:specify{(0.6*2).shouldeql(1.2)}specify{(0.3*3).shouldeql(0.3*3)}specify{(0.3*3).shouldeql(0.9)}#thisonefails这是为什么呢?这是浮点问题还是ruby或rspec问题? 最佳答案 从rspec-2.1开始specify{(0.6*2).shouldbe_within(0.01).of(1.2)}在那之前:specify{(0.6*2).shouldbe_close(1.2,0.01)}
我看到有关未找到文件min.map的错误消息:GETjQuery'sjquery-1.10.2.min.mapistriggeringa404(NotFound)截图这是从哪里来的? 最佳答案 如果ChromeDevTools报告.map文件的404(可能是jquery-1.10.2.min.map、jquery.min.map或jquery-2.0.3.min.map,但任何事情都可能发生)首先要知道的是,这仅在使用DevTools时才会请求。您的用户不会遇到此404。现在您可以修复此问题或禁用sourcemap功能。修复:获取文