2012-04-01 35 views
7
function bb_graphics_GraphicsContext(){ 
    Object.call(this); 
    this.bbdevice=null; 
    this.bbmatrixSp=0; 
    this.bbix=1.000000; 
    this.bbiy=0; 
    this.bbjx=0; 
    this.bbjy=1.000000; 
    this.bbtx=0; 
    this.bbty=0; 
    this.bbtformed=0; 
    this.bbmatDirty=0; 
    this.bbcolor_r=0; 
    this.bbcolor_g=0; 
    this.bbcolor_b=0; 
    this.bbalpha=0; 
    this.bbblend=0; 
    this.bbscissor_x=0; 
    this.bbscissor_y=0; 
    this.bbscissor_width=0; 
    this.bbscissor_height=0; 
    this.bbmatrixStack=new_number_array(192); 
} 

Object.call(this) có nghĩa là gì?"Object.call" có nghĩa là gì?

+1

Bạn có thể muốn làm rõ rằng bạn đang tự hỏi tại sao một hàm tạo cụ thể (hàm "bb_graphics_GraphicsContext") sẽ làm điều đó với tham chiếu 'this' của chính nó. – Pointy

+0

Nó được coi là nhà xây dựng. Nhưng nếu nó, phải gọi bên ngoài chức năng. – miqbal

+0

Đã thêm bình luận bổ sung vào cuối câu trả lời của tôi để nhận được những gì nó làm, và cung cấp suy nghĩ về lý do tại sao nó được thực hiện. –

Trả lời

-1

Mọi chức năng JavaScript đều có toString(), call()apply().

Đọc thêm về chúng trên this odetocode.com article

+1

tôi biết điều đó. Tôi muốn biết điều gì xảy ra trong bối cảnh này. Từ khóa này đề cập đến cái gì? Điều gì xảy ra sau cuộc gọi đó - Object.call (điều này); – DrStrangeLove

+0

Nó chuyển sang một hàm đệ quy. – miqbal

+0

@miqbal uhh ... cái gì? Nó không biến bất cứ điều gì thành một hàm đệ quy; điều đó có nghĩa là gì? – Pointy

9

Chức năng trong JavaScript là full-fledged đối tượng. Họ cũng, khi được thông qua như là một đối số cho một chức năng khác, không giữ lại phạm vi của họ. Vì vậy, trong đoạn mã sau ...

var obj1 = { 
    property1: "blah", 
    method1: function() { 
     alert(this.property1); 
     // do stuff 
    } 
}; 

function func1 (passedFunction) { 
    passedFunction(); 
    // do other stuff 
} 

func1(obj1.method1); 

... func1 sẽ gọi obj1.method1, nhưng nó sẽ không alert giá trị của obj1 's property1, bởi vì tất cả chúng tôi đã làm là vượt qua các đối tượng chức năng, không phải là ngữ cảnh this của nó. Đó là nơi callapply đi vào. Chúng cho phép bạn tiêm phạm vi, cho biết hàm ý nghĩa của this sẽ là gì. Ví dụ sau hoạt động:

var obj1 = { 
    property1: "blah", 
    method1: function() { 
     alert(this.property1); 
     // do stuff 
    } 
}; 

function func1 (passedObject, passedFunction) { 
    passedFunction.call(passedObject); 
    // do other stuff 
} 

func1(ob1, obj1.method1); 

Bây giờ, chúng tôi đã buộc hay nói một cách rõ ràng những gì obj1.method1 ngữ cảnh của nó sẽ bằng cách gọi call, và đi qua nó là đối tượng nó để sử dụng như this.

callapply gần như giống hệt nhau, ngoại trừ cách chúng xử lý các đối số bổ sung cho hàm đang được gọi. Xem các bài viết này trên MDN để biết thêm thông tin: call, applyFunction.

Tất cả điều này đã được nói, bb_graphics_GraphicsContext là một hàm tạo. (Bạn có thể đoán được điều này.) Bạn gọi nó bằng cách sử dụng từ khóa new, var obj1 = new bb_graphics_GraphicsContext();. Khi nó đạt đến dòng 1 của hàm, nó lấy đối tượng this và gọi hàm dựng chung Object, tiêm một đối tượng mới this (trong phương thức khởi tạo bb_graphics_GraphicsContext) làm this của hàm tạo Object. Tôi giả định rằng người viết hàm/constructor này đã làm điều này để đảm bảo rằng đối tượng mới được tạo ra trong bb_graphics_GraphicsContext đã nhận được tất cả các phương thức cơ sở của cơ sở Object. Nhưng tôi không biết tại sao điều này là cần thiết, như thể bạn gọi bb_graphics_GraphicsContext với từ khóa new, nó sẽ lấy tất cả các thuộc tính này một cách tự nhiên.

+1

Tất cả điều đó là hoàn toàn đúng, nhưng nó vẫn * không trả lời câu hỏi * tại sao * ai đó sẽ làm điều đó với constructor 'Object'. – Pointy

+0

Điểm tốt. Sửa đổi câu trả lời. –

+0

có thể ai đó muốn xác định lại đối tượng sau? – DrStrangeLove

0

Object.call sẽ thực hiện một chức năng nhất định trong ngữ cảnh được cung cấp, nó có thể được sử dụng để gọi hàm từ một đối tượng trên một đối tượng khác.

Mạng mozilla dev cung cấp một lời giải thích rất tốt

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+1

"Hàm nhất định" trong trường hợp này là chính hàm dựng của 'Object'. – Pointy

0

này sẽ làm hoàn toàn không có gì ngoại trừ lãng phí phân bổ nguồn lực và trí nhớ.

Nếu Object.call (this) sẽ được gán cho một biến hoặc tài sản của hàm constructor bb_graphics_GraphicsContext

this.myObject = Object.cuộc gọi (this)

Điều duy nhất mà bạn nhận được trong trường hợp đó là một đối tượng rỗng "THAT DO KHÔNG GIỮ BỐI CẢNH CUNG CẤP"

function MyConstructor(){ 
    this.test01 = 0; 
    var b = Object.call(this); // similar to b = {}; or b = new Object() 
    console.log(b); // log object 
    console.log(b.test); // log undefined 
    this.test = 1; 
} 

var myObject = new MyConstructor(); 

console.log(myObject, window.test01) 
0

Mặc dù Object.call lẽ sẽ không làm gì được thể hiện ở đây, khái niệm có thể là quan trọng. Về cơ bản, ví dụ bạn sẽ thấy về thừa kế trong Node.js documentation là:

const util = require('util'); 
const EventEmitter = require('events'); 

function MyStream() { 
    EventEmitter.call(this); 
} 

util.inherits(MyStream, EventEmitter); 

Các util.inherits sẽ làm cho một MyStream kế thừa mới (có mẫu giống như) EventEmmiter. Điều này có thể là đủ nếu chúng ta quan tâm đến MyStream có quyền truy cập vào các chức năng được kế thừa thông qua nguyên mẫu EventEmmiter. Nhưng điều gì sẽ xảy ra nếu có các biến được truyền vào xây dựng? Điều gì nếu chúng ta có:

function MyObject() { 
    this.code = "2nV_ahR"; 
} 

Trong trường hợp này, biến code được thông qua vào thời gian chạy khi MyObject được khởi tạo. Do đó, một lớp con cần phải vượt qua:

function MySubObject() { 
    MyObject.call(this); 
} 

Để kế thừa biến code. Điều gì call chấp nhận một tham số đặt biến số this. Vì vậy ... khi tôi làm var o = new MySubObject(), các this bên trong MySubObject đề cập đến o, sau đó được truyền cho phương thức call, để khi MyObject không this.code = ... nó thực sự đi qua các code-o!