ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript オブジェクト指向の例の詳細な説明

JavaScript オブジェクト指向の例の詳細な説明

小云云
小云云オリジナル
2018-02-12 09:47:242057ブラウズ

コンストラクターとプロトタイプオブジェクト

コンストラクターも関数です。通常の関数との違いは、最初の文字が大文字であることです。ただし、コンストラクターが通常の関数として呼び出される場合 (new キーワードが欠落している場合)、これが指摘する問題に注意する必要があります。この記事ではJavaScriptのオブジェクト指向の本質を中心に紹介していきますので、お役に立てれば幸いです。


var name = "Pomy";
function Per(){
  console.log("Hello "+this.name);
}
var per1 = new Per(); //"Hello undefined"
var per2 = Per();  //"Hello Pomy"

new を使用すると、このオブジェクトは自動的に作成され、その型はコンストラクター型で、 new キーワードのないオブジェクト インスタンスを指します。これはグローバル オブジェクトを指します。

instanceof を使用してオブジェクトの種類を検出することができます。同時に、各オブジェクトは作成時にコンストラクター属性を自動的に持ち、そのコンストラクター (リテラル形式で作成されたオブジェクト、または Object を指すオブジェクト、によって作成されたオブジェクト) を指します。カスタム コンストラクター) はそのコンストラクターを指します)。


console.log(per1 instanceof Per); //true
console.log(per1.constructor === Per); //true

すべてのオブジェクト インスタンスには、オブジェクトのプロトタイプ オブジェクトを指す内部プロパティ [[Prototype]] があります。コンストラクター自体にも、プロトタイプ オブジェクトを指すプロトタイプ属性があります。作成されたすべてのオブジェクトは、このプロトタイプ オブジェクトのプロパティとメソッドを共有します。


function Person(){}
Person.prototype.name="dwqs";
Person.prototype.age=20;
Person.prototype.sayName=function()
{
  alert(this.name);
};
var per1 = new Person();
per1.sayName(); //dwqs
var per2 = new Person();
per2.sayName(); //dwqs
alert(per1.sayName == per2.sayName); //true

つまり、インスタンス内のポインターはプロトタイプのみを指し、コンストラクターは指しません。 ES5 は、プロトタイプ オブジェクトとインスタンスの間の関係を反映する hasOwnProperty() メソッドと isPropertyOf() メソッドを提供します


alert(Person.prototype.isPrototypeOf(per2)); //true
per1.blog = "www.ido321.com";
alert(per1.hasOwnProperty("blog")); //true
alert(Person.prototype.hasOwnProperty("blog")); //false
alert(per1.hasOwnProperty("name")); //false
alert(Person.prototype.hasOwnProperty("name")); //true

プロトタイプ オブジェクトのコンストラクター プロパティはコンストラクター自体を指しているため、書き換える際にはコンストラクター プロパティに注意する必要がありますプロトタイプのポインティング問題。


function Hello(name){
  this.name = name;
}
//重写原型
Hello.prototype = {
  sayHi:function(){
    console.log(this.name);
  }
};
var hi = new Hello("Pomy");
console.log(hi instanceof Hello); //true
console.log(hi.constructor === Hello); //false
console.log(hi.constructor === Object); //true

オブジェクト リテラル形式を使用してプロトタイプ オブジェクトを書き直すと、コンストラクターのプロパティが変更されるため、コンストラクターは Hello ではなく Object を指すようになります。コンストラクター ポインターが重要な場合は、プロトタイプ オブジェクトを書き換えるときにそのコンストラクター プロパティを手動でリセットする必要があります


Hello.prototype = {
  constructor:Hello,
  sayHi:function(){
    console.log(this.name);
  }
};
console.log(hi.constructor === Hello); //true
console.log(hi.constructor === Object); //false

プロトタイプ オブジェクトの特性を利用して、JavaScript の組み込みプロトタイプ オブジェクトにカスタム メソッドを簡単に追加できます。


Array.prototype.sum=function(){
  return this.reduce(function(prev,cur){
    return prev+cur;
  });
};
var num = [1,2,3,4,5,6];
var res = num.sum();
console.log(res); //21
String.prototype.capit = function(){
  return this.charAt(0).toUpperCase()+this.substring(1);
};
var msg = "hello world";
console.log(msg.capit()); //"Hello World"

継承

[[Prototype]] 機能を使用すると、オブジェクトのプロトタイプ継承をリテラルの形式で実装できます。Object.prototype は暗黙的に [[Prototype]] として指定されます。 create() は明示的に指定され、2 つのパラメータを受け取ります。1 つ目は [[Prototype]] が指すオブジェクト (プロトタイプ オブジェクト)、2 つ目はオプションの属性記述子オブジェクトです。


var book = {
  title:"这是书名";
};
//和下面的方式一样
var book = Object.create(Object.prototype,{
  title:{
    configurable:true,
    enumerable:true,
    value:"这是书名",
    wratable:true
  }
});

Literal オブジェクトはデフォルトで Object を継承します。さらに興味深い使用方法は、カスタム オブジェクト間の継承を実装することです。


var book1 = {
  title:"JS高级程序设计",
  getTitle:function(){
    console.log(this.title);
  }
};
var book2 = Object.create(book1,{
  title:{
    configurable:true,
    enumerable:true,
    value:"JS权威指南",
    wratable:true
  }
});
book1.getTitle(); //"JS高级程序设计"
book2.getTitle(); //"JS权威指南"
console.log(book1.hasOwnProperty("getTitle")); //true
console.log(book1.isPrototypeOf("book2")); //false
console.log(book2.hasOwnProperty("getTitle")); //false

book2 の getTitle 属性にアクセスすると、JavaScript エンジンは検索プロセスを実行します。ここで book2 の独自の属性を検索し、見つからない場合はそれを使用し、[[Prototype]] を検索します。見つからない場合は、継承チェーンの終わりまでプロトタイプ オブジェクトの [[Prototype]] の検索を続けます。通常、末尾は Object.prototype で、 [[Prototype]] は null に設定されます。

継承を実装するもう 1 つの方法は、コンストラクターを使用することです。各関数には書き込み可能なプロトタイプ属性があり、デフォルトで Object.prototype から継承するように自動的に設定されます。プロトタイプ チェーンを上書きすることで変更できます。


function Rect(length,width){
  this.length = length;
  this.width = width;
}
Rect.prototype.getArea = function(){
  return this.width * this.length;
};
Rect.prototype.toString = function(){
  return "[Rect"+this.length+"*"+this.width+"]";
};
function Square(size){
  this.length = size;
  this.width = size;
}
//修改prototype属性
Square.prototype = new Rect();
Square.prototype.constructor = Square;
Square.prototype.toString = function(){
  return "[Square"+this.length+"*"+this.width+"]";
};
var rect = new Rect(5,10);
var square = new Square(6);
console.log(rect.getArea()); //50
console.log(square.getArea()); //36

親クラスの toString() にアクセスしたい場合は、次のようにすることができます:


Square.prototype.toString = function(){
  var text = Rect.prototype.toString.call(this);
  return text.replace("Rect","Square");
}

関連する推奨事項:


JavaScript オブジェクト指向の新しい理解

javascriptオブジェクト指向定義メンバー メソッドインスタンスの分析

JavaScriptのオブジェクト指向の基礎とこれが指摘する問題の具体的な分析

以上がJavaScript オブジェクト指向の例の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。