ホームページ > 記事 > ウェブフロントエンド > JavaScript オブジェクト指向の基礎 (2)
JavaScript のオブジェクト指向の基礎 (1) Constructor とプロトタイプオブジェクト Constructor も関数です。通常の関数との違いの 1 つは、最初の文字を大文字にすることです。 。ただし、コンストラクターが通常の関数として呼び出される場合 (new キーワードが欠落している場合)、これが指摘する問題に注意する必要があります。
var name = "Pomy"; function Per(){ console.log("Hello "+this.name); } var per1 = new Per(); //"Hello undefined" var per2 = Per(); //"Hello Pomy"new を使用すると、このオブジェクトの型はコンストラクター型で、オブジェクト インスタンスを指します。new キーワードが欠落している場合、これはグローバル オブジェクトを指します。 instanceof を使用してオブジェクトの種類を検出することができます。同時に、各オブジェクトは作成時にコンストラクター属性を自動的に持ち、そのコンストラクター (リテラル形式またはオブジェクト コンストラクターによって作成されたオブジェクト、オブジェクトを指す、作成されたオブジェクト) を指します。カスタム コンストラクターによって)、そのコンストラクターを指します)。
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"継承
var book = { title:"这是书名"; }; //和下面的方式一样 var book = Object.create(Object.prototype,{ title:{ configurable:true, enumerable:true, value:"这是书名", wratable:true } });リテラル オブジェクトはデフォルトで 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")); //falsebook2 の getTitle 属性にアクセスすると、JavaScript エンジンは検索プロセスを実行します。次に、book2 の独自の属性を検索し、見つからない場合はそれを使用し、見つからない場合は [[Prototype]] を検索します。 , continue 継承チェーンの終わりまで、プロトタイプ オブジェクトの [[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 オブジェクト指向の本質 (2) の内容です。さらに関連する内容については、PHP に注目してください。中国語のウェブサイト (www.php.cn)!