在本文中,我们将带你了解在javascript中获取构造函数本身内的原型构造函数的名称在这篇文章中,我们将为您详细介绍在javascript中获取构造函数本身内的原型构造函数的名称的方方面面,并解答j
在本文中,我们将带你了解在javascript中获取构造函数本身内的原型构造函数的名称在这篇文章中,我们将为您详细介绍在javascript中获取构造函数本身内的原型构造函数的名称的方方面面,并解答js获取原型的方法有常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的
- 在javascript中获取构造函数本身内的原型构造函数的名称(js获取原型的方法有)
普通函数与构造函数的区别 - javascript – “构造函数”函数,不应与构造函数调用一起使用
- javascript – 为什么替换构造函数的原型没有反映在Objects中?
- javascript – 原型链,构造函数,继承
在javascript中获取构造函数本身内的原型构造函数的名称(js获取原型的方法有)
是否有可能在javascript中获取类本身的类名?它对我的中间件中动态创建的类的递归很有用.
认为这是一个非常不正确的帖子 – 所以我更好地定义了我想要解决的问题:
MyClass = function(){
this.classname = ??? // Here is required and needed to store as a property
}
MyClass.prototype.log = function(){
alert(this.classname); // The alert should be MyClass
}
var myClassObj = new MyClass();
myClassObj.log();
解决方法:
你可能正在寻找这个:
function MyClass() {};
var myInstance = new MyClass();
console.log(myInstance.constructor.name === "MyClass");
// true
要使其工作,您必须声明上述函数,而不是使用MyClass = function(){}.然后,使用函数的name
属性,利用原型链(查询构造函数属性时).
如果需要直接在构造函数中访问,请使用构造函数引用:
function MyClass() { console.log(this.constructor.name === "MyClass"); };
var myInstance = new MyClass();
// true
这个问题涉及类似的主题,它也可能对你有用:
Get name as String from a Javascript function reference?
普通函数与构造函数的区别
JavaScript中存在构造函数与函数两个概念。
这可能会给初学者造成一定的困扰,难不成存在两种函数。
然而事实这两种函数的构成完全一样,无论从长相还是气质都是一模一样的。
区别点在于,所扮演觉得不同,同一个人在不同的场合具有不同的角色。
就比如曹操对将要出征的曹彰所说"居家为父子受事为君臣"。
同是曹彰,在家里与曹操的是父子关系,领兵在外则是上下级关系。
构造函数与普通函数也是如此,代码实例如下:
function Foo(){} Foo(); let f=new Foo();
Foo()是作为普通函数使用,使用new 调用则是作为构造函数使用。
使用方式的不同,自然会产生很多差别,下面分别做一下介绍。
一.首字母大小写惯例:
这不是语法规定,而是使用惯例。
作为构造函数,函数的首字母通常会使用大写形式,作为普通函数则习惯于用小写形式。
构造函数扮演的就是标准面向对象语言中类的角色,ES2015新增class类概念。
遵循此原则有利于团队合作开发,外观即可推断函数将要扮演的角色。
二.函数中this的指向不同:
普通函数中的this,在严格模式下指向undefined,非严格模式下指向window对象。
而构造函数的this则是指向它创建的对象实例。
function Foo(){ console.log(this===window); } Foo();
代码运行效果截图如下:
非严格模式下指向window对象,严格模式下指向undefined,不再演示。
function Foo(){ this.webName="蚂蚁部落"; } let f=new Foo(); console.log(f.webName);
代码运行效果截图如下:
构造函数中的this指向它所创建的对象实例。
三.return语句的使用:
普通函数通常要使用return语句返回一个值,如果没有return语句默认返回undefined。
而构造函数则一般不需要return语句,当然也可以有return语句,感觉使用return完全没有意义。
返回值分为两种情况:
(1).如果构造函数return一个值类型数据,那么完全忽略此return语句,和没有一样。
(2).如果构造函数return一个引用类型数据,那么它的返回值就是此引用类型数据,而不是创建的对象实例。
四.箭头函数:
ES2015新增箭头函数,它只能作为普通使用,不能用作构造函数。
javascript – “构造函数”函数,不应与构造函数调用一起使用
在You don’t know JS系列丛书(特别是“this& Object Prototypes”标题)以及许多SO答案(例如this one)中,经常会发现没有“构造函数”这样的东西,而是通过调用的普通函数. “构造函数调用”.我试图通过创建vanilla函数来解决这一问题,这些函数并不是用new来调用来创建我的对象.
第一次尝试有效:
var assert = function(condition,message) { if (!condition) throw new Error(message||'assertion error'); }; var Counter1 = function() { var count = 0; return {get: function() {return count;},inc: function() {count++;}}; }; var c2a = Counter1(); c2a.inc(); assert(c2a.get()===1); var c2b = Counter1(); assert(c2b.get()===0); assert(c2a.get()===1); // prevIoUs counter is a separate object
现在我试图通过不每次重新创建getter / setter函数来改进上面的代码,而只是简单地将它们分配给原型(这里我失败了):
var Counter2 = function Counter2_() { var count = 0; Counter2_.prototype.get = function() {return count;}; Counter2_.prototype.inc = function() {count++;}; assert(Counter2_.prototype.constructor === Counter2_); var rv = {}; rv.__proto__ = Counter2_.prototype; return rv; }; var c = Counter2(); c.inc(); assert(c.get()===1); assert(Object.getPrototypeOf(c)===Counter2.prototype); var cb = Counter2(); assert(Object.getPrototypeOf(cb)===Counter2.prototype); assert(cb.get()===0); assert(c .get()===1,'expecting c to be 1 but was:'+c.get());
上面的代码在最后一行失败了.
我的理解是上面的代码没有成功维护单独的计数器,因为每次调用Counter2函数时,先前对象的原型get被设置为新创建的函数,该函数在词法上绑定到新计数(再次初始化为0).此外,代码是愚蠢的,因为每次调用Counter2函数时都会再次创建函数,并在原型上反复重新分配(带来的灾难性结果是无法维护单独的计数器).
然而,尝试将分配放置在Counter2函数之外的原型也会失败,因为count变量不再在范围内:
var Counter3 = function Counter3_() { var count = 0; var rv = {}; rv.__proto__ = Counter3_.prototype; return rv; }; Counter3.prototype.get = function() {return count;}; // this fails - I no longer have access to count's lexical scope Counter3.prototype.get = function() {return this.count;}; // this fails too
我的问题是:
1)我的解读为什么Counter2无法保持单独的计数器正确?
2)有没有办法使用这个习惯用法(即使用不想用new调用的“vanilla”函数),并且每次调用函数时都避免重新创建getter / setter?
解决方法
function Counter2(name) { var count = 0; Counter2.prototype.get = function() {return count;}; Counter2.prototype.inc = function() {count++;}; var rv = {}; if(name) { rv.get = function() {console.log(name); return count;}; } console.log(count) rv.__proto__ = Counter2.prototype; return rv; } var a = Counter2('a'); var b = Counter2('b'); var c = Counter2();
在下面的示例中,a和b不继承get函数,因为它们的get键未定义并指向不同的函数实例.请记住,如果传入一个名称,并且每次猜到以下输出将被重新定义时,计数变量仍然会被分配和唯一绑定.
a.inc();a.inc(); [a.get(),b.get(),c.get()]
是:
[0,2]
2)是和否.您可以轻松返回具有每次都不会分配的函数的对象,但如果绑定了变量,它们将在它们之间共享.奇怪的是,通过使用原型继承和新的运算符,这可以很容易地完成.
例如,以下代码不会每次都分配新函数,但a.inc()将增加b的值,如果调用则增加其他值.
var count = 0; function inc() {++count;} function get() {return count;} function Count() { return {inc: inc,get: get}; }; var a = Count(); var b = Count();
通过使用new运算符,可以实现唯一绑定的“变量”,而无需每次都分配新函数.
function Count(){} Count.prototype.count = 0; Count.prototype.get = function() {return this.count;}; Count.prototype.inc = function() {this.count++;}; var a = new Count(); var b = new Count(); a.inc(); a.get(); >>1 b.get(); >>0 a.inc === b.inc >>true
javascript – 为什么替换构造函数的原型没有反映在Objects中?
function animal() {} var frog = new animal(); animal.prototype.color = 'Green'; console.log(frog.color); // 'Green'
但是如果我在new关键字之后使用obj.prototype = {key:val},它会给我一个未定义的代码,如
function animal() {} var frog = new animal(); animal.prototype = { color: 'Green' }; console.log(frog.color); // 'undefined' -- why?
如果我在新关键字之前更改了原型的顺序,它会没问题,这很奇怪,为什么?因为我们知道对象的原型允许我们向该对象的所有实例添加属性(甚至是现有实例),对吧?
代码就像
function animal() {} animal.prototype = { color: 'Green' }; var frog = new animal(); console.log(frog.color); // 'Green'
解决方法
function animal() {} var frog = new animal(); console.log(Object.getPrototypeOf(frog) === animal.prototype); # true animal.prototype = { color: 'Green' }; console.log(Object.getPrototypeOf(frog) === animal.prototype); # false console.log(frog.color);
在第一个console.log中,它打印为true,因为new已将动物的原型对象设置为frog的内部[[Prototype]]对象.但是,当你为动物的原型分配一些其他对象时,青蛙的内部[[Prototype]]对象仍然引用旧对象,它没有颜色属性.这就是它打印未定义的原因.
当您更改顺序时,遇到新语句时,它会获取动物的原型对象(您指定的新对象),并创建青蛙对象.这就是为什么它具有颜色属性.
现在,您可能想知道为什么第一个案例工作正常.因为,
animal.prototype.color = 'Green';
不会将animal.prototype替换为其他一些对象,但它会变异(或增加,如果您愿意的话)animal.prototype对象.因此,frog的内部[[Prototype]]属性仍然与animal.prototype对象相同.
javascript – 原型链,构造函数,继承
我正在玩javascript原型.我是新手,所以我有一个小问题.
我正在使用这个article作为指南.
我已经定义了一个产品并定义了一本书. Book.prototype.constructor = Book()的目的是什么?这个.我弄不清楚.我能够成功调用父构造函数和不使用它.
Book.prototype = new Product;
Book.prototype.constructor = Book; // What's the purpose of this
这是我的jsfiddle link
您可能认为您也可以说:Book.prototype = Product.prototype,但该解决方案无法按预期工作. Book的原型成为Product的原型指针,因此它不是副本.如果你想改变Book的原型,它实际上是在Product的原型中改变的,那不是你想要的.
不久,新的Product()创建了所有原型变量的副本.
但这种方法也存在问题.如果要立即创建新Book,则调用Product构造函数,而不是Book构造函数.要解决这个问题,你需要再次正确设置构造函数,它将工作:
Book.prototype.constructor = Book;
// Note: it's not Book(),but Book,it's a reference to the function
关于在javascript中获取构造函数本身内的原型构造函数的名称和js获取原型的方法有的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于
本文标签: