検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptにおける通常の関数とコンストラクタの比較_javascriptスキル

質問

コンストラクターとは何ですか?
コンストラクターと通常の関数の違いは何ですか?
新しいキーワードを使用したとき、具体的には何をしましたか?
コンストラクターに戻り値がある場合はどうすればよいですか?
コンストラクターは通常の関数として呼び出すことができますか?

以下は私の理解の一部です。誤解がある場合は修正してください。ありがとうございます。

これ
これは常に、現在実行されている関数またはメソッドの所有者を指します。例:

function test(){
  console.log(this);
}
test();
//Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

上記のコードでは、ページ内で test() 関数を定義し、ページ内でそれを呼び出します。関数がグローバルに定義されている場合、その所有者は現在のページ (ウィンドウ オブジェクト) になります。

これが示すいくつかの状況

1. グローバルに電話をかける

this.name //this はウィンドウ オブジェクトを指します

2. 関数呼び出し

test();//test() 関数内のこれもウィンドウ オブジェクトを指します

3. オブジェクトメソッド呼び出し

obj1.fn();//obj1 オブジェクトの fn() メソッド内のこれは obj1
を指します
4. コンストラクター
を呼び出します var Dog=new Dog();//コンストラクター内の this は、新しく作成されたインスタンス オブジェクトを指します。これは、dogcall であり、ここでは apply

です

call と apply の機能は同じですが、call は複数の単一パラメータを受け入れますが、apply はパラメータの配列を受け入れます。
call と apply の役割は、簡単に言うと、オブジェクト インスタンスに関数/メソッドがない場合、これをこのオブジェクト インスタンスに置き換えて関数の実行時コンテキストを変更することで、他のオブジェクトの既製の関数/メソッドを呼び出すことができます。
例:

function Dog(){
  this.sound="汪汪汪";
}
Dog.prototype.bark=function(){
  alert(this.sound);
}

これで、別の猫オブジェクトができました:

var cat={sound:'ニャーニャー'}

この cat オブジェクトが bark メソッドを呼び出せるようにしたいのですが、現時点では、call/apply を使用して Dog クラスの bark メソッドを呼び出すことができます。

Dog.prototype.bark.call(cat);

または:

dog.bark.call(cat);

パラメーターを使用して栗に変える何かを追加します:

function Dog(){
  this.sound="汪汪汪";
}
Dog.prototype.bark=function(words){
  alert(this.sound+" "+words);
}
var dog=new Dog();
dog.bark("有小偷");//alert:汪汪汪  有小偷
Dog.prototype.bark.call(cat,"饿了");//alert:喵喵喵  饿了

共通機能
これは単純な通常の関数です:

function fn(){
  alert("hello sheila");
}
fn();//alert:hello sheila

通常の関数には、コンストラクターと比較して 4 つの明らかな特徴があります。

1.

を呼び出すために新しいキーワードを使用する必要はありません。

fn();2. return ステートメントを使用して値

を返すことができます。
 function fn(a,b){
    return a+b;
  }
  alert(fn(2,3));//alert:5

3. 関数内で this キーワードを使用することはお勧めしません
使用は推奨されていませんが、必要に応じて使用することももちろん可能です。現時点で何が起こるかに注意してください。通常の関数内で this キーワードを使用して変数または関数を定義すると、この時点ではウィンドウ グローバル オブジェクトを指しているため、一部のグローバル変数または関数が意図せずウィンドウに追加されます。

function greeting(){
    this.name="sheila";
    alert("hello "+this.name);
  }
  greeting();//alert:hello sheila
  alert(window.name);//alert:sheila

4. 関数名はキャメルケースで、最初の文字は小文字です

コンストラクター
JavaScript では、 new キーワードを使用して、定義されたコンストラクターを呼び出します。デフォルトで返されるのは、コンストラクターによって定義された変数と関数/メソッドを含む新しいオブジェクトです。

例を挙げてください:

function Prince(name,age){
  this.gender="male";
  this.kind=true;
  this.rich=true;
  this.name=name;
  this.age=age;
}
Prince.prototype.toFrog=function(){
  console.log("Prince "+this.name+" turned into a frog.");
}
var prince=new Prince("charming",25);
prince.toFrog();//Prince charming turned into a frog.
prince.kind;//true

与普通函数相比,构造函数有以下明显特点:

1.用new关键字调用

    var prince=new Prince("charming",25);

2.函数内部可以使用this关键字
在构造函数内部,this指向的是构造出的新对象。用this定义的变量或函数/方法,就是实例变量或实例函数/方法。需要用实例才能访问到,不能用类型名访问。

 prince.age;//25
    Prince.age;//undefined

3.默认不用return返回值
构造函数是不需要用return显式返回值的,默认会返回this,也就是新的实例对象。当然,也可以用return语句,返回值会根据return值的类型而有所不同,细节将在下文介绍。

4.函数命名建议首字母大写,与普通函数区分开。
不是命名规范中的,但是建议这么写。

使用new关键字实例化的时候发生了什么?
以上文中的Prince()函数举个栗子:

1.第一步,创建一个空对象。

var prince={}

2.第二步,将构造函数Prince()中的this指向新创建的对象prince。
3.第三步,将prince的_proto_属性指向Prince函数的prototype,创建对象和原型间关系
4.第四步,执行构造函数Prince()内的代码。

构造函数有return值怎么办?
构造函数里没有显式调用return时,默认是返回this对象,也就是新创建的实例对象。
当构造函数里调用return时,分两种情况:

1.return的是五种简单数据类型:String,Number,Boolean,Null,Undefined。
这种情况下,忽视return值,依然返回this对象。

2.return的是Object
这种情况下,不再返回this对象,而是返回return语句的返回值。

function Person(name){
    this.name=name;
    return {name:"cherry"}
  }
  var person=new Person("sheila");
  person.name;//cherry
  p;//Object {name: "cherry"}
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
es6中箭头函数和普通函数的区别是什么es6中箭头函数和普通函数的区别是什么Mar 08, 2022 pm 12:11 PM

区别:1、箭头函数的定义要比普通函数定义简洁、清晰得多,很快捷;2、箭头函数不会创建自己的this,而普通函数会;3、箭头函数不能作为构造函数使用,而箭头函数能作为构造函数使用;4、箭头函数没有自己的arguments,而箭头函数有。

Python中的构造函数Python中的构造函数Sep 02, 2023 pm 04:29 PM

在Python中,每个类都有一个构造函数,它是类内部指定的特殊方法。构造函数/初始化程序将在为类创建新对象时自动调用。当对象被初始化时,构造函数将值分配给类中的数据成员。没有必要显式定义构造函数。但为了创建构造函数,我们需要遵循以下规则-对于一个类,它只允许有一个构造函数。构造函数名称必须是__init__。必须使用实例属性定义构造函数(只需将self关键字指定为第一个参数)。它不能返回除None之外的任何值。语法classA():def__init__(self):pass示例考虑下面的示例并

C++语法错误:定义在类外的构造函数必须加上类名作为限定符,应该怎么改正?C++语法错误:定义在类外的构造函数必须加上类名作为限定符,应该怎么改正?Aug 22, 2023 pm 02:00 PM

C++是一种广泛使用的面向对象编程语言,C++中定义类的构造函数时,如果希望将构造函数的定义放在类外部,那么就需要在构造函数的定义中加上类名作为限定符,以指定这个构造函数是属于哪个类的。这是C++语法的一条基本规定。如果在定义类的构造函数时没有遵守这个规定,就会出现编译错误,提示“定义在类外的构造函数必须加上类名作为限定符”。那么,如果碰到这种编译错误,应该

go语言有构造函数吗go语言有构造函数吗Jan 10, 2023 pm 02:15 PM

go语言没有构造函数。go语言作为结构化的语言是没有面向对象语言中的构造方法的,不过可以通过一些方式实现类似的面向对象语言中构造方法的效果,也就是使用结构体初始化的过程来模拟实现构造函数。

箭头函数和普通函数的区别箭头函数和普通函数的区别Sep 13, 2023 am 09:32 AM

箭头函数和普通函数的区别主要在语法简洁性、this指向不同、不适用于构造函数、无arguments对象等。详细介绍:1、语法简洁性,箭头函数的语法相对于普通函数更加简洁,箭头函数可以使用箭头来定义,省略了function关键字和花括号,可以直接定义函数的参数和返回值,箭头函数在只有一个参数的情况下,还可以省略括号;2、this指向的不同等等。

什么是构造函数?详解JavaScript中的构造函数什么是构造函数?详解JavaScript中的构造函数Aug 04, 2022 pm 03:22 PM

作为原型和原型链的基础,先了解清楚构造函数以及它的执行过程才能更好地帮助我们学习原型和原型链的知识。本篇文章带大家详细了解一下JavaScript中的构造函数,介绍一下怎么利用构造函数创建一个js对象,希望对大家有所帮助!

C++报错:构造函数必须在public区域声明,怎么处理?C++报错:构造函数必须在public区域声明,怎么处理?Aug 21, 2023 pm 08:26 PM

在C++编程中,构造函数是用来初始化类的成员变量的重要函数。它在创建对象时自动调用,以确保对象的正确初始化。构造函数必须在类中声明,但是有时会遇到错误提示“构造函数必须在public区域声明”。这个错误通常是因为构造函数的访问权限修饰符错误引起的。在C++中,类的成员变量和成员函数都有一个访问权限修饰符,包括public、private和protected。

C++语法错误:相同的构造函数签名出现多次,应该怎么解决?C++语法错误:相同的构造函数签名出现多次,应该怎么解决?Aug 22, 2023 pm 04:49 PM

C++是一门强大的编程语言,但是在使用过程中,难免会遇到各种问题。其中,相同的构造函数签名出现多次就是一种常见的语法错误。本文将介绍这种错误的原因和解决方法。一、错误原因在C++中,构造函数用于创建对象时初始化对象的数据成员。但是,如果在同一个类中定义了相同的构造函数签名(即参数类型和顺序相同),编译器就无法确定要调用哪一个构造函数,从而引起编译错误。例如,

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。