我应该为其他人将从中继承的第一个父对象传递哪个参数,哪个参数更有效
Object.create(Object.prototype)
Object.create(Object)
Object.create(null)
Object.create(null) 返回一个空对象
Object.create(Object) 返回一个函数,为什么????(我检查了我的日志,它说函数...我使用了 console.dir() )
Object.create(Object) 返回一个非空对象
这整个事情是如何工作的......我更习惯于 Classname .prototype :(
不明白这是怎么回事
最佳答案
前言:JavaScript使用原型(prototype)继承,这意味着一个对象可以有(通常确实有)一个原型(prototype)在它的后面,它是另一个对象。如果您尝试从对象中获取某个属性的值,而该对象不具有该属性,则 JavaScript 引擎会查看该对象的原型(prototype)(及其原型(prototype)等)以找到它。
Object.create 创建对象。您给 Object.create 的第一个参数是用作它创建的对象原型(prototype)的对象。所以:
// Create an object with a property 'foo'
var a = {
foo: 42
};
// Create a blank object using `a` as its prototype
var b = Object.create(a);
// Give `b` a property of its own
b.bar = "hi";
这给了我们这样的内存:
+−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−+
| [[Prototype]] |−−−−−>| (the standard |
a−−−−−−−−−−−−−−−−−−−−−−+−−>| foo: 42 | | object prototype) |
| +−−−−−−−−−−−−−−−+ +−−−−−−−−−−−−−−−−−−−+
|
+−−−−−−−−−−−−−−−+ |
b−−>| [[Prototype]] |−−+
| bar: "hi" |
+−−−−−−−−−−−−−−−+
Proof b uses a:
console.log(b.foo); // 42
a.foo = 67;
console.log(b.foo); // 67
解决您的一些变体:
var o = Object.create(Object.prototype);
这与 var o = {}; 完全相同:它创建一个新的空白对象,其原型(prototype)是对象 Object.prototype 引用。
var o = Object.create(Object);
这将创建一个新的空白对象 o,其原型(prototype)是 Object 函数。它不创建函数,只是创建一个以函数为原型(prototype)的非函数对象。这会很奇怪,可能不是你想要的。 :-)
var o = Object.create(null);
创建一个新的空白对象o,其原型(prototype)为null。因为它的原型(prototype)是 null,所以它没有通常的 Object.prototype 东西,比如 toString 和 valueOf和 hasOwnProperty。这有点不寻常,尽管它有一些用例,例如当您将对象用作字典/ map 并且不希望这些属性名称出现误报时。 (在 ES2015 [又名 ES6] 中,另一种选择是使用 Map。)
正如 thg435 在下面的评论中指出的那样,关于 JavaScript 的一个令人困惑的事情是对象的原型(prototype)与您在函数上看到的 prototype 属性完全不同。如果 prototype 属性有一个不同的名称可能会更好(尽管我无法想象它会是什么名字而不是非常笨拙)。
一个对象(我们称它为 o)有一个原型(prototype)对象,它从中继承属性。 (在 ES2015+ 中,您可以通过 Object.getPrototypeOf 访问该对象。)函数的 prototype 属性上的对象根本不一定是任何对象的原型(prototype)。相反,它是将指定为使用该函数通过 new 创建的任何对象的原型(prototype)的对象。
例子在这里很有帮助。
function Foo() {
}
该函数 Foo 具有引用对象的属性 Foo.prototype。该对象尚未用作任何事物的原型(prototype)。它只是一个分配给 Foo 对象实例上名为 prototype 的属性的对象。
var f = new Foo();
现在该对象被用作原型(prototype),具体来说,它是由 new Foo 调用创建的 f 对象的原型(prototype)。
忽略一些细节,这行代码:
var f = new Foo();
...基本上是这样做的:
// Create a blank object, giving it `Foo.prototype` as its prototype
var f = Object.create(Foo.prototype);
// Call` Foo` using that new object as `this`
Foo.call(f);
正如我所说,这遗漏了一些细节,但希望它有助于阐明函数的 prototype 属性的用途...
关于javascript - Object.create(Object.prototype) , Object.create(Object) 和 Object.create(null) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16666231/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是
我在破坏脚本的字符串中出现了一些奇怪的字符。据我所知,通过putbadstring到控制台,它们是"\0\0\0\0"。我想对此进行测试,以便我可以忽略它们...但是如何呢?以为这就是blank?和empty?的用途?!?:>badstring="\0"=>"\u0000">badstring.blank?NoMethodError:undefinedmethod`blank?'for"\u0000":Stringfrom(irb):97from/Users/meltemi/.rvm/rubies/ruby-2.0.0-p195/bin/irb:16:in`'>badstring.em
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年