GVKun编程网logo

在javascript中获取构造函数本身内的原型构造函数的名称(js获取原型的方法有)

16

在本文中,我们将带你了解在javascript中获取构造函数本身内的原型构造函数的名称在这篇文章中,我们将为您详细介绍在javascript中获取构造函数本身内的原型构造函数的名称的方方面面,并解答j

在本文中,我们将带你了解在javascript中获取构造函数本身内的原型构造函数的名称在这篇文章中,我们将为您详细介绍在javascript中获取构造函数本身内的原型构造函数的名称的方方面面,并解答js获取原型的方法有常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的 普通函数与构造函数的区别、javascript – “构造函数”函数,不应与构造函数调用一起使用、javascript – 为什么替换构造函数的原型没有反映在Objects中?、javascript – 原型链,构造函数,继承

本文目录一览:

在javascript中获取构造函数本身内的原型构造函数的名称(js获取原型的方法有)

在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> 普通函数与构造函数的区别

普通函数与构造函数的区别

JavaScript中存在构造函数与函数两个概念。

这可能会给初学者造成一定的困扰,难不成存在两种函数。

然而事实这两种函数的构成完全一样,无论从长相还是气质都是一模一样的。

区别点在于,所扮演觉得不同,同一个人在不同的场合具有不同的角色。

就比如曹操对将要出征的曹彰所说"居家为父子受事为君臣"。

同是曹彰,在家里与曹操的是父子关系,领兵在外则是上下级关系。

构造函数与普通函数也是如此,代码实例如下:

function Foo(){}  
Foo();
let f=new Foo();

Foo()是作为普通函数使用,使用new 调用则是作为构造函数使用。

使用方式的不同,自然会产生很多差别,下面分别做一下介绍。

一.首字母大小写惯例:

这不是语法规定,而是使用惯例。

作为构造函数,函数的首字母通常会使用大写形式,作为普通函数则习惯于用小写形式。

构造函数扮演的就是标准面向对象语言中类的角色,ES2015新增class类概念。

遵循此原则有利于团队合作开发,外观即可推断函数将要扮演的角色。

二.函数中this的指向不同:

普通函数中的this,在严格模式下指向undefined,非严格模式下指向window对象。

而构造函数的this则是指向它创建的对象实例。

function Foo(){
  console.log(this===window);
}  
Foo();

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/25/171321f0u83fuh5upshtsh.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

非严格模式下指向window对象,严格模式下指向undefined,不再演示。

function Foo(){
  this.webName="蚂蚁部落";
}  
let f=new Foo();
console.log(f.webName);

代码运行效果截图如下:

a:3:{s:3:\"pic\";s:43:\"portal/201811/25/171354schcf4t1xari2xzx.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

构造函数中的this指向它所创建的对象实例。

三.return语句的使用:

普通函数通常要使用return语句返回一个值,如果没有return语句默认返回undefined。

而构造函数则一般不需要return语句,当然也可以有return语句,感觉使用return完全没有意义。

返回值分为两种情况:

(1).如果构造函数return一个值类型数据,那么完全忽略此return语句,和没有一样。

(2).如果构造函数return一个引用类型数据,那么它的返回值就是此引用类型数据,而不是创建的对象实例。

四.箭头函数:

ES2015新增箭头函数,它只能作为普通使用,不能用作构造函数。

javascript – “构造函数”函数,不应与构造函数调用一起使用

javascript – “构造函数”函数,不应与构造函数调用一起使用

(完整代码在 this github repo)

在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?

解决方法

1)是的,每次重新定义原型的get和inc.原型不是“封闭”的,原型继承的链式行为使这成为可能.

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中?

javascript – 为什么替换构造函数的原型没有反映在Objects中?

如果我只使用obj.prototype.property = val,一切都会好的,代码就像

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'

解决方法

使用new关键字创建新Object时,新创建的对象的内部[[Property]]对象将设置为构造函数的原型对象.

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 – 原型链,构造函数,继承

我正在玩javascript原型.我是新手,所以我有一个小问题.

我正在使用这个article作为指南.

我已经定义了一个产品并定义了一本书. Book.prototype.constructor = Book()的目的是什么?这个.我弄不清楚.我能够成功调用父构造函数和不使用它.

Book.prototype = new Product;
Book.prototype.constructor = Book; // What's the purpose of this

这是我的jsfiddle link

最佳答案
首先,new Product()创建一个包含Product函数的所有原型变量的对象.因此,通过设置Book.prototype = new Product(),Book继承了Product的所有原型变量.

您可能认为您也可以说: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获取原型的方法有的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于 普通函数与构造函数的区别、javascript – “构造函数”函数,不应与构造函数调用一起使用、javascript – 为什么替换构造函数的原型没有反映在Objects中?、javascript – 原型链,构造函数,继承的相关信息,请在本站寻找。

本文标签: